尝试编译hadoop-0.20.205这个版本,编译过程出现了如下小错误:/home/user/github/hadoop-common/build.xml:1611: /home/user/github/hadoop-common/build/hadoop-0.20.205.1/native not found.
以上提示是在说native目录没有找到,hadoop引入了本地库的概念,通过本地库可以使Hadoop更高效的做某些事情,目前在Hadoop中本地库应用在文件的压缩上面:
1. zlib
2. gzip
解决过程:
1. 进入到/hadoop-common/src/native目录,先尝试直接编译本地库:./configure
2. 编译没有通过,并打出如下错误:configure: error: Native java headers not found. Is $JAVA_HOME set correctly?
3. export JAVA_HOME
4. 再次执行./configure,编译通过
5. 执行ant mvn-install,通过
注1:在ubuntu下可能还会有些其它错误,总之依次执行./configure make make install看能不能通过就行了。
注2:编译native应该按正常流程来,即:ant compile-native,请参考:http://wiki.apache.org/hadoop/UsingLzoCompression
注3:在执行ant mvn-install 或 ant mvn-deploy时一直失败,但是在这之前先执行ant compile-native就ok了,好像是build.xml依赖有点问题;
导入到eclipse:
1. cd hadoop-common
2. ant eclipse
a). 为导入eclipse生成.classpath (依赖包环境变量)
b). 生成相应的配置文件:
./conf/mapred-site.xml
./conf/hadoop-policy.xml
./conf/hdfs-site.xml
./conf/core-site.xml
./conf/capacity-scheduler.xml
./conf/fair-scheduler.xml
./conf/hadoop-env.sh
3. 在eclipse中新建一个Java Project,选择"Create project from existing source",选择hadoop-common目录
4. 下一步,切换到"Libraries",选择"Add Class Folder..." 按钮,从列表中选择"conf";
5. 切换到"Order and Export"找到"conf",点击top把它移到顶端;]
6. 切换到"Source",将output folder设置为build/eclipse_build(这一步视自己情况而定),点击finish,完成导入;
7. 将JDK的tools.jar 添加到 build path。注:tools.jar没有包含在JRE中,所以要手工加一下;
8. 导入后还有点其它小问题,根据提示依次解决即可;
PS1:也可以使用ivyDE来更新依赖,具体参考:http://tech.zhenhua.info/2010/11/svn-subclipse.html
PS2:ant版本:1.7.1 maven版本:3.0.3
PS3:hadoop的新版本都开始使用maven做为项目依赖管理,应该是更加方便一些
PS4:Unbound classpath variable: 'ANT_HOME/lib/ant.jar' in project 'hadoop-common'
原因:没有将ant的路径添加到eclipse中
解决方法:点击菜单“window”—>"preferences"—>依次点击左侧树形结构“Java”—>“Build Path”—>“ClassPath Variable”,在右侧增加环境变量,点击“New”,Name中写入“ANT_HOME”,Path为eclipse路径下的plugins下,如/home/lxsym/work/eclipse/plugins/org.apache.ant_1.7.1.v20100518-1145。
附1:
在使用这两种压缩方式的时候,Hadoop默认会从$HADOOP_HOME/lib/native/Linux-*目录中加载本地库。
如果加载成功,输出为:
DEBUG util.NativeCodeLoader - Trying to load the custom-built native-hadoop library...
INFO util.NativeCodeLoader - Loaded the native-hadoop library
如果加载失败,输出为:
INFO util.NativeCodeLoader - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
在Hadoop的配置文件core-site.xml中可以设置是否使用本地库:
<property>
<name>hadoop.native.lib</name>
<value>true</value>
<description>Should native hadoop libraries, if present, be used.</description>
</property>
Hadoop默认的配置为启用本地库。
另外,可以在环境变量中设置使用本地库的位置:
export JAVA_LIBRARY_PATH=/path/to/hadoop-native-libs
有的时候也会发现Hadoop自带的本地库无法使用,这种情况下就需要自己去编译本地库了。在$HADOOP_HOME目录下,使用如下命令即可:
ant compile-native
编译完成后,可以在$HADOOP_HOME/build/native目录下找到相应的文件,然后指定文件的路径或者移动编译好的文件到默认目录下即可。
若干问题:
1. ant compile-native失败:
[exec] libtool: link: gcc -shared .libs/ZlibCompressor.o .libs/ZlibDecompressor.o .libs/SnappyCompressor.o .libs/SnappyDecompressor.o .libs/getGroup.o .libs/JniBasedUnixGroupsMapping.o .libs/JniBasedUnixGroupsNetgroupMapping.o .libs/file_descriptor.o .libs/errno_enum.o .libs/NativeIO.o -ljvm -ldl -m64 -Wl,-soname -Wl,libhadoop.so.1 -o .libs/libhadoop.so.1.0.0 [exec] /usr/bin/ld: cannot find -ljvm [exec] collect2: ld returned 1 exit status [exec] make[1]: Leaving directory `/home/fengzanfeng/tmp/hadoop-common/build/native/Linux-amd64-64' [exec] make[1]: *** [libhadoop.la] Error 1 [exec] make: *** [all] Error 2
参考:
https://issues.apache.org/jira/browse/HADOOP-4949
http://ilinuxkernel.com/?p=1185