64位linux系统编译hadoop源码 native库

下面是自己编译hadoop源码, 然后将native库上传覆盖hadoop的过程
 
 
0 hadoop native库:
在hadoop压缩时 调用此库文件的jni(.so)来调用linux系统的功能, 一般我们的linux机器都是64位,而官网下载的hadoop安装文件都是32位编译的,因此如果不在你本机编译的话,想使用hadoop压缩功能受限。
 
0.1 如何知道你的native库是否已经编译过
  1. cd/opt/hadoop2.5.2/lib/native下,[root@hadoop3 native]# file libhadoop.so.1.0.0   看到这个文件是64位的,这里我编译成功后显示结果如下: libhadoop.so.1.0.0: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, not stripped
  2. 或者直接用  #hdfs dfs -ls /  执行任何一个hadoop命令,如果出现:Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 则表示没有编译过
  3. 或者执行[root@hadoop3 native]# hadoop  checknative  Native library checking:
    hadoop: false 
    zlib:   false 
    snappy: false 
    lz4:    false 
    bzip2:  false   如果显示结果是这样的,也表示没有编译过
     
     
     
    0.2  为何native库不编译就报Unable to load native-hadoop library的信息:
    具体报错为:
     java.lang.UnstatisfiedLinkError:
     /usr/local/hadoop-2.6.0/lib/native/libhadoop.so.1.0.0:/lib64/libc.so.6: version 'GLIBC 2.14' not found
     意思是hadoop native的libhadoop.so.1.0.0需要编译的版本为GLIBC 2.14,而在本地linux上没找到
 
查看hadoop native的GLIBC支持的版本: 
[root@hadoop3 native]#  strings libhadoop.so.1.0.0 | grep GLIBC    查看hadoop native库
GLIBC_2.2.5
GLIBC_2.12
GLIBC_2.7
GLIBC_2.14
GLIBC_2.6
GLIBC_2.4
GLIBC_2.3.4
查看本地linux的GLIBC版本 
[root@hadoop3 native]# strings /lib64/libc.so.6 | grep GLIBC   查看 linux
GLIBC_2.2.5
GLIBC_2.2.6
GLIBC_2.3
GLIBC_2.3.2
GLIBC_2.3.3
GLIBC_2.3.4
GLIBC_2.4
GLIBC_2.5
GLIBC_2.6
GLIBC_2.7
GLIBC_2.8
GLIBC_2.9
GLIBC_2.10
GLIBC_2.11
GLIBC_2.12
上面报错可见,在linux上没有GLIBC 2.14,因此报错,处理方式只能是将hadoop源码在本地linux上用本地c库来编译,这样在跑hadoop时就会用本地的c库。
 
 
 
1 下面是编译hadoop源码,顺带自带生成编译后的 native库,然后将编译好的native库上传替代你安装的hadoop
的lib/native库下东西即可, 最后我会贴出我的配置文件 /etc/profile的写法
 
1.0  安装contos, 我本机安装的是6.6 查看版本信息为:
[root@hadoop3 bin]#  cat /etc/redhat-release 
CentOS release 6.6 (Final)
 
1.1 安装jdk, 我按照的1.7
[root@hadoop3 bin]# java -version
java version "1.7.0_71"
 
 
1.2 安装maven, maven历史版本下载地址:  https://archive.apache.org/dist/maven/binaries/
     这里我下载的版本如下
[root@hadoop3 ~]#  mvn -version
Apache Maven 3.0.5
  配置信息见最后的 /etc/profile
 
1.3 安装protoc
  hadoop使用protocol buffer通信,从protoc官网下载protoc,下载地址是https://code.google.com/p/protobuf/downloads/list,选择protobuf-2.5.0.tar.gz 下载。
基于google访问不到,因此我将protobuf-2.5.0.tar.gz 上传到附件上。64位linux系统编译hadoop源码 native库
 

为了编译安装protoc,需要下载几个工具,顺序执行以下命令

yum install gcc  
    yum intall gcc-c++ 跑这块时报错(Loaded plugins: fastestmirror, refresh-packagekitsecurity No such command: intall.),没有处理继续执行下面命令,最终也能编译过hadoop
yum install make

如果操作系统是CentOS6.5那么gcc和make已经安装了。其他版本不一定。在命令运行时,需要用户经常输入“y”。

然后执行以下命令解压缩protobuf

[root@hadoop3 protobuf-2.5.0]# pwd
/opt/soft/protobuf-2.5.0 下执行下面命令
tar -zxvf  protobuf-2.5.0.tar.gz

会生成一个文件夹protobuf-2.5.0,执行以下命令编译protobuf。

cd protobuf-2.5.0  
    ./configure --prefix=/usr/local/protoc/  
    make && make install

只要不出错就可以了(我本机执行没有出错)

配置 protoc的环境变量信息见最后的 /etc/profile文件
 
[root@hadoop3 ~]# protoc --version
libprotoc 2.5.0
 
1.4 安装其他依赖:

顺序执行以下命令

yum install cmake  
    yum install openssl-devel  
    yum install ncurses-devel

安装完毕即可,这里我是一把过的。

1.5 编译hadoop-2.5.2源码
 
官网下载hadoop-2.5.2源码hadoop-2.5.2-src.tar.gz,
解压后查看文件 
hadoop-2.5.2-src/hadoop-common-project/hadoop-auth中的文件pom.xml 55行以下是否有
 <dependency>
         <groupId>org.mortbay.jetty</groupId>
         <artifactId>jetty-util</artifactId>
         <scope>test</scope>
    </dependency>
如果没有添加上,如果有就不做修改,说是个bug(adoop-2.2.0的)。 这里我的版本2.5.2源码已经修复,因此不需要添加,
好了,现在进入到目录/usr/local/hadoop-2.5.2-src中,执行命令
 
mvn package -DskipTests -Pdist,native
 
该命令会从外网下载依赖的jar,编译hadoop源码,需要花费很长时间,40多分钟吧。
 
 
 
 
第一次编译失败截图如下,就是因为1.3步骤的protc没有配置对环境变量造成:
 
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 25:54.735s
[INFO] Finished at: Mon Jun 20 06:55:13 PDT 2016
[INFO] Final Memory: 47M/113M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.hadoop:hadoop-maven-plugins:2.5.2:protoc (compile-protoc) on project hadoop-common: org.apache.maven.plugin.MojoExecutionException: 'protoc --version' did not return a version -> [Help 1]
 
 
64位linux系统编译hadoop源码 native库
 
 
如下是最后编译成功的截图耗时:
 
64位linux系统编译hadoop源码 native库
 
 
1.6  /etc/profile配置信息:
export JAVA_HOME=/opt/jdk1.7
export HADOOP_HOME=/opt/hadoop-2.5.2
export HIVE_HOME=/opt/hive0.13
export ZK_HOME=/opt/zk
export FLUME_HOME=/opt/flume1.5.2
 
#export SOLR_HOME=/opt/solr4
export HBASE_HOME=/opt/hbase-0.98.12
#export KYLIN_HOME=/opt/kylin-0.7.1
#export ZOOKEEPER_HOME=/opt/zookeeper-3.4.5
#export OOZIE_HOME=/opt/foroozie4.0/oozie
export TOMCAT_HOME=/opt/tomcat7
export ANT_HOME=/opt/ant1.9.7
export MAVEN_HOME=/opt/maven305
export LD_LIBRARY_PATH=/usr/local/protoc
 
export PATH=.:$LD_LIBRARY_PATH/bin:$MAVEN_HOME/bin:$ANT_HOME/bin:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HIVE_HOME/bin:$ZK_HOME/bin:$FLUME_HOME/bin:$HBASE_HOME/bin:$TOMCAT_HOME/bin:$PATH
 
 
1.7  将编译后的native包下载,后上传替换 /opt/hadoop-2.5.2/lib/native下
 
编译后的native路径: /opt/soft/hadoop-2.5.2-src/hadoop-dist/target/hadoop-
2.5.2/navive64位linux系统编译hadoop源码 native库
 
 
然后执行命令:  可以看到识别 native库了
[root@hadoop3 bin]#  hadoop  checknative
16/06/20 20:12:30 WARN bzip2.Bzip2Factory: Failed to load/initialize native-bzip2 library system-native, will use pure-Java version
16/06/20 20:12:30 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library
Native library checking:
hadoop: true /opt/hadoop-2.5.2/lib/native/libhadoop.so.1.0.0
zlib:   true /lib64/libz.so.1
snappy: false 
lz4:    true revision:99
bzip2:  false 
 
然后重启hadoop集群(我没试验过不需要重启下),执行任意hadoop命令:
[root@hadoop3 bin]# hdfs dfs -ls /
此时不会再出现 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable的提示。 编译native库完毕。

相关推荐