hadoop1.2.1编译eclipse插件

来源:互联网 发布:djvu阅读器 知乎 编辑:程序博客网 时间:2024/04/28 11:19

这几天学习hadoop,我竟然花了一天多的时间来搭建环境。主要是自己遇到了其他文章中都没出现的问题。废话不说了,现在就开始搭建。

        首先我是在ubuntu的虚拟机下工作的,准备工作一定要做好。

安装jdk,此处我一开始是利用sudo apt-get install openjdk-7-jre,这样做主要是为了方便,省的配置路径,但这给后边的编译造成了麻烦,请大家注意我这里只是安装了JRE,没有安装JDK,所以必须再执行sudo apt-get install openjdk-7-jdk,这样才能把jdk成功安装上去,否则在后边变异的时候会出现javac编译不成功或者不存在之类的错误。

、这里通常其他文章会说安装ant,但是ubuntu通常情况下会自带ant,而且版本比较高,所以我在这里就不说了。

、再下来就是安装eclipse,在这里我要强调一下,不是所有eclipse的版本对hadoop都有支持,所以选择对的eclipse版本占到了成功的70%,就像我一开始选择eclipse3.7Indigo不论后边如何配置正确都会编译失败,原因是该版本eclipse本来就有些包不存在,你要自己下载,会浪费时间,而且即使下载下来,他的包也不是只在/plugins下,是被分在几个文件里的(从openstock上得知),所以网上的配置都不会生效。而这个版本又是ubuntu12利用apt-get install下载的默认版本,所以会造成很多问题。最后我把这个版本完完全全从机子上卸载掉,下载了eclipse4.2Juno,只需要下载classic版本就可以了其他的没必要。从官网上把该版本对应的压缩包下载到机子上解压就可以了。注:据说eclipse4.3对hadoop的支持又不好了,所以最好还是选择4.2吧。

     四、下载hadoop源码,我下载的是1.2.1稳定版本,大家一定要选择源码,因为官网会提供编译好的版本和源码两个版本,编译插件要选用源码版本,就是名字中没有bin的版本。在下载的时候也会有问题,就是可能有下载不全的时候,这时tar包在解压的时候会出现错误,如果是这样,就苦逼的在下载一遍吧。

     五、这一步就是其他文章都会提到的了,配置很简单,但有些文章说的太少,配置的根本有问题,有些文章说的太多,很多重复的东西。

(1)配置/${hadoop-home}/src/contrib/eclipse-plugins/build.xml

找到

<path id="classpath">
然后添加
<fileset dir="${hadoop.root}/">       <include name="*.jar"/></fileset>
这一步很重要,如果不添加的话会出现找不到相应的程序包,错误如下(给出部分):

[javac]       Counters.Group group = counters.getGroup(groupName);    [javac]               ^    [javac] /home/summerdg/hadoop_src/hadoop-1.2.1/src/contrib/eclipse-plugin/src/java/org/apache/hadoop/eclipse/server/HadoopJob.java:305: 错误: 程序包Counters不存在    [javac]       for (Counters.Counter counter : group) {    [javac]                    ^    [javac] /home/summerdg/hadoop_src/hadoop-1.2.1/src/contrib/eclipse-plugin/src/java/org/apache/hadoop/eclipse/dfs/DFSFile.java:74: 错误: 找不到符号    [javac]       FileStatus fs = getDFS().getFileStatus(path);    [javac]       ^    [javac]   符号:   类 FileStatus    [javac]   位置: 类 DFSFile    [javac] 注: 某些输入文件使用或覆盖了已过时的 API。    [javac] 注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。    [javac] 注: 某些输入文件使用了未经检查或不安全的操作。    [javac] 注: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。    [javac] 100 个错误
当然,出现这个错误还有个原因,就是你已经设置了这句,但你依然出现这个错误,那就是你eclipse版本的问题了。

找到

<target name="jar" depends="compile" unless="skip.contrib">


删除或者注释掉下边的两个<copy file的内容,然后添加

    <copy file="${hadoop.root}/hadoop-core-${version}.jar" tofile="${build.dir}/lib/hadoop-core.jar" verbose="true"/>    <copy file="${hadoop.root}/lib/commons-cli-1.2.jar"  todir="${build.dir}/lib" verbose="true"/>    <copy file="${hadoop.root}/lib/commons-lang-2.4.jar"  todir="${build.dir}/lib" verbose="true"/>    <copy file="${hadoop.root}/lib/commons-configuration-1.6.jar"  todir="${build.dir}/lib" verbose="true"/>    <copy file="${hadoop.root}/lib/jackson-mapper-asl-1.8.8.jar"  todir="${build.dir}/lib" verbose="true"/>    <copy file="${hadoop.root}/lib/jackson-core-asl-1.8.8.jar"  todir="${build.dir}/lib" verbose="true"/>    <copy file="${hadoop.root}/lib/commons-httpclient-3.0.1.jar"  todir="${build.dir}/lib" verbose="true"/>

最后修改过的build.xml如下:

?xml version="1.0" encoding="UTF-8" standalone="no"?><!--   Licensed to the Apache Software Foundation (ASF) under one or more   contributor license agreements.  See the NOTICE file distributed with   this work for additional information regarding copyright ownership.   The ASF licenses this file to You under the Apache License, Version 2.0   (the "License"); you may not use this file except in compliance with   the License.  You may obtain a copy of the License at       http://www.apache.org/licenses/LICENSE-2.0   Unless required by applicable law or agreed to in writing, software   distributed under the License is distributed on an "AS IS" BASIS,   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   See the License for the specific language governing permissions and   limitations under the License.--><project default="jar" name="eclipse-plugin">  <import file="../build-contrib.xml"/>  <path id="eclipse-sdk-jars">    <fileset dir="${eclipse.home}/plugins/">      <include name="org.eclipse.ui*.jar"/>      <include name="org.eclipse.jdt*.jar"/>      <include name="org.eclipse.core*.jar"/>      <include name="org.eclipse.equinox*.jar"/>      <include name="org.eclipse.debug*.jar"/>      <include name="org.eclipse.osgi*.jar"/>      <include name="org.eclipse.swt*.jar"/>      <include name="org.eclipse.jface*.jar"/>      <include name="org.eclipse.team.cvs.ssh2*.jar"/>      <include name="com.jcraft.jsch*.jar"/>    </fileset>   </path>  <!-- Override classpath to include Eclipse SDK jars -->  <path id="classpath">    <pathelement location="${build.classes}"/>    <pathelement location="${hadoop.root}/build/classes"/>    <path refid="eclipse-sdk-jars"/>    <fileset dir="${hadoop.root}/">        <include name="*.jar"/>    </fileset>  </path>  <!-- Skip building if eclipse.home is unset. -->  <target name="check-contrib" unless="eclipse.home">    <property name="skip.contrib" value="yes"/>    <echo message="eclipse.home unset: skipping eclipse plugin"/>  </target> <target name="compile" depends="init, ivy-retrieve-common" unless="skip.contrib">    <echo message="contrib: ${name}"/>    <javac     encoding="${build.encoding}"     srcdir="${src.dir}"     includes="**/*.java"     destdir="${build.classes}"     debug="${javac.debug}"     deprecation="${javac.deprecation}">     <classpath refid="classpath"/>    </javac>  </target>  <!-- Override jar target to specify manifest -->  <target name="jar" depends="compile" unless="skip.contrib">    <mkdir dir="${build.dir}/lib"/>  <!--  <copy file="${hadoop.root}/build/hadoop-core-${version}.jar" tofile="${build.dir}/lib/hadoop-core.jar" verbose="true"/>    <copy file="${hadoop.root}/build/ivy/lib/Hadoop/common/commons-cli-${commons-cli.version}.jar"  todir="${build.dir}/lib" verbose="true"/>-->    <copy file="${hadoop.root}/hadoop-core-${version}.jar" tofile="${build.dir}/lib/hadoop-core.jar" verbose="true"/>    <copy file="${hadoop.root}/lib/commons-cli-1.2.jar"  todir="${build.dir}/lib" verbose="true"/>    <copy file="${hadoop.root}/lib/commons-lang-2.4.jar"  todir="${build.dir}/lib" verbose="true"/>    <copy file="${hadoop.root}/lib/commons-configuration-1.6.jar"  todir="${build.dir}/lib" verbose="true"/>    <copy file="${hadoop.root}/lib/jackson-mapper-asl-1.8.8.jar"  todir="${build.dir}/lib" verbose="true"/>    <copy file="${hadoop.root}/lib/jackson-core-asl-1.8.8.jar"  todir="${build.dir}/lib" verbose="true"/>    <copy file="${hadoop.root}/lib/commons-httpclient-3.0.1.jar"  todir="${build.dir}/lib" verbose="true"/>    <jar      jarfile="${build.dir}/hadoop-${name}-${version}.jar"      manifest="${root}/META-INF/MANIFEST.MF">      <fileset dir="${build.dir}" includes="classes/ lib/"/>      <fileset dir="${root}" includes="resources/ plugin.xml"/>    </jar>  </target></project>

(2)配置/${hadoop-home}/src/contrib/build-contrib.xml

指定hadoop版本和eclipse路径,添加:

<property name="version" value="1.2.1"/>  <property name="ivy.version" value="2.1.0"/>  <property name="eclipse.home" location="/home/summerdg/eclipse"/>

location下面是eclipse的解压路径。

(3)配置/${hadoop-home}/src/contrib/eclipse-plugins/META-INF/MANIFEST.MF

在Bundle-ClassPath: classes/,lib/hadoop-core.jar后边添加lib/jackson-core-asl-1.8.8.jar ,lib/jackson-mapper-asl-1.8.8.jar, lib/commons-configuration-1.6.jar,lib/commons-lang-2.4.jar, lib/commons-httpclient-3.0.1.jar,lib/commons-cli-1.2.jar,其他文章说不能另起一行,要紧挨着,所以最后该文件的样子就是:

Manifest-Version: 1.0Bundle-ManifestVersion: 2Bundle-Name: MapReduce Tools for EclipseBundle-SymbolicName: org.apache.hadoop.eclipse;singleton:=trueBundle-Version: 0.18Bundle-Activator: org.apache.hadoop.eclipse.ActivatorBundle-Localization: pluginRequire-Bundle: org.eclipse.ui, org.eclipse.core.runtime, org.eclipse.jdt.launching, org.eclipse.debug.core, org.eclipse.jdt, org.eclipse.jdt.core, org.eclipse.core.resources, org.eclipse.ui.ide, org.eclipse.jdt.ui, org.eclipse.debug.ui, org.eclipse.jdt.debug.ui, org.eclipse.core.expressions, org.eclipse.ui.cheatsheets, org.eclipse.ui.console, org.eclipse.ui.navigator, org.eclipse.core.filesystem, org.apache.commons.loggingEclipse-LazyStart: trueBundle-ClassPath: classes/,lib/hadoop-core.jar,lib/jackson-core-asl-1.8.8.jar ,lib/jackson-mapper-asl-1.8.8.jar, lib/commons-configuration-1.6.jar,lib/commons-lang-2.4.jar, lib/commons-httpclient-3.0.1.jar,lib/commons-cli-1.2.jarBundle-Vendor: Apache Hadoop
(4)然后在/${hadoop-home}/src/contrib/eclipse-plugins/下运行ant或者ant jar

即使这样还是会出现问题,如果提示ivy的版本问题,类似于ivy的版本要高于2.0,只需要到/${hadoop-home}/ivy下把ivy-2.1.0.jar删除掉就可以了,不用从官网下载ivy-2.1.0.jar,这个错误的原因是ivy下载有错误造成的,删除掉之后编译过程中会自动下载。(所以整个过程要联网)


还会可能会出现一个问题,就是说某某类/函数已过时,这个问题虽然不会影响到最后的编译,但装到eclipse里边就会出现failed login error,所以如果出现这个问题就得重新编译,重新编译时要把过去配置编译的文件全部删除,否则即使重新ant出来的文件还会是错误的。

由于不知道怎么清理,所以我的做法就是把源码删掉,再次解压,重新配置,重新编译,如果有网友知道怎么做更为方便,就留个言

(5)把/${hadoop-home}/build/contrib/eclipse-plugins/下的hadoop-1.2.1-eclipse-plugins.jar复制到eclipse/plugins目录下,重新启动eclipse(如果之前没有启动eclipse,启动就可以了),然后在windows->preference里会出现,Hadoop Map/Reduce下设置编译好的hadoop目录。然后点击右上角的Open Perspectives,在下方会出现Map/Reduce location,然后点击New Hadoop Location,配置信息,location name 随意,Map/Reduce Master和DFS Master的配置和/hadoop-1.2.1/conf下的core-site.xml和hdfs-site.xml下的设置一样,这类设置和其他文章说的一样




注:整个配置过程要在有网络的环境下进行,而且确保hadoop已经开启,如果此时还是出现failed login error,就请你查看hadoop-1.2.1-eclipse-plugins.jar下的lib下的jar包,如果所有的jar包后边都没有版本号,那就会有问题,就请你重新编译,直到里边的jar包有了版本号。