hadoop源码编译
在hadoop的官方网站,每个发行的版本都提供了 源码包 和 编译后的二进制发行包,那如何选择了?
下载编译后的包,在系统上解压,设置配置文件后就可以直接使用,但在使用hadoop命名过程中,每次都会显示一个警告,如
hadoop fs -ls / WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
提示不能使用本地的lib,使用内部的java class来应用。这个本地的native library是需要根据自己的环境编译的,
虽说不影响使用,但每次都提示,看着也不舒服。另一方面,官方给的编译后的包是基于32位jvm编译的,在64位jvm上运行,不能发挥性能优势
基于上面的原因,为了更好的发挥hadoop性能,还是自己根据本地系统的环境,编译源码比较好
这里使用的是CDH版本的hadoop,这个更稳定一些,也是推荐的版本,cdh官方下载网站http://archive.cloudera.com/cdh5/cdh/5/,
选择相应的版本,如hadoop-2.6.0-cdh5.5.1-src.tar.gz版本,
直接下载,然后解压,操作如下:
wget http://archive.cloudera.com/cdh5/cdh/5/hadoop-2.6.0-cdh5.5.1-src.tar.gz, tar zxvf hadoop-2.6.0-cdh5.5.1-src.tar.gz cd hadoop-2.6.0-cdh5.5.1
more BUILDING.txt,查看编译说明,
Requirements: * Unix System * JDK 1.7+ * Maven 3.0 or later * Findbugs 1.3.9 (if running findbugs) * ProtocolBuffer 2.5.0 * CMake 2.6 or newer (if compiling native code), must be 3.0 or newer on Mac * Zlib devel (if compiling native code) * openssl devel ( if compiling native hadoop-pipes ) * Internet connection for first build (to fetch all Maven and Hadoop dependencies)
必备条件:
unix系统
jdk 1.7以上
maven 3.0版本以上
findbugs 1.3.9版本(如果运行findbugs)
ProtocolBuffer 2.5.0版本
cmake 2.6以上(如果编译本地代码),mac系统上必须是3.0版本以上
zlib devel(如果编译本地代码)
openssl devel(如编译本地hadoop管道)
网络连接(需要获取maven和所有的hadoop依赖)
接下来就按照这些要求,安装所需的软件包,当前系统是64位CentOS 系统
1) 安装 Java
wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/7u79-b15/jdk-7u79-linux-x64.tar.gz
tar zxvf jdk-7u79-linux-x64.tar.gz
解压后直接使用,配置环境变量即可
export JAVA_HOME=/usr/local/jdk1.7.0_79
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
2) 安装 maven
wget http://mirror.tcpdiag.net/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz
tar zxvf apache-maven-3.3.9-bin.tar.gz
解压后直接使用,配置环境变量即可
export MAVEN_HOME=/usr/local/apache-maven-3.3.9
export PATH=${PATH}:${MAVEN_HOME}/bin
3) 安装findbugs
没有找到直接在linux上下载的版本,所以从http://olex.openlogic.com/packages/findbugs/1.3.9上下载到本地后,上传到linux上
解压,unzip openlogic-findbugs-1.3.9-all-bin-1.zip
配置环境变量
export FINDBUGS_HOME=/usr/local/findbugs-1.3.9
export PATH=${PATH}:${FINDBUGS_HOME}/bin
4) 安装protocolBuffer
git clone https://github.com/google/protobuf.git
cd protobuf
./autogen.sh 下载gmock source,运行automake,autoconf等等,并且生成configure script和各种makefiles模板
./configure
make,然后漫长等待
make install
完成后,查看版本信息 protoc --version
5) 安装cmake,zlib devel,openssl devel
yum install cmake zlib-devel openssl-devel
到此,所需要的软件包都已经安装完毕,由于hadoop可以选择不同的压缩算法来压缩文件,所以还需要安装相关的压缩包,如bzip2, lz4, snappy, zlib
yum install lzo-devel snappy lz4 bzip2
环境变量,配置的是全局的,在/etc/profile里,内容如下:
export JAVA_HOME=/usr/local/jdk1.7.0_79 export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH export MAVEN_HOME=/usr/local/apache-maven-3.3.9 export PATH=${PATH}:${MAVEN_HOME}/bin export FINDBUGS_HOME=/usr/local/findbugs-1.3.9 export PATH=${PATH}:${FINDBUGS_HOME}/bin
记住,修改完/etc/profile后,需要运行 source /etc/profile,让配置文件立即生效
接下来最重要的事情要出现了,编译源码。在编译前,再看下BUILDING.txt文件,文件中间有个Building distributions,先来看下,
Building distributions: Create binary distribution without native code and without documentation: $ mvn package -Pdist -DskipTests -Dtar Create binary distribution with native code and with documentation: $ mvn package -Pdist,native,docs -DskipTests -Dtar Create source distribution: $ mvn package -Psrc -DskipTests Create source and binary distributions with native code and documentation: $ mvn package -Pdist,native,docs,src -DskipTests -Dtar Create a local staging version of the website (in /tmp/hadoop-site) $ mvn clean site; mvn site:stage -DstagingDirectory=/tmp/hadoop-site
里面有各种编译的用法,我们使用 mvn package -Pdist,native,src -DskipTests -Dtar ,创建二进制分发包,本地code,源码即可,文档就不需要了
运行 mvn package -Pdist,native,src -DskipTests -Dtar , 等待编译结果,编译速度根据网络来定,因为maven需要下载各种依赖包来编译打包,
编译过程中出错
[ERROR] Failed to execute goal org.apache.hadoop:hadoop-maven-plugins:2.6.0-cdh5.5.1:protoc (compile-protoc) on project hadoop-common: org.apache.maven.plugin.MojoExecutionException: protoc version is 'libprotoc 3.0.0', expected version is '2.5.0' -> [Help 1]
说是期望libprotoc 2.5.0版本,现在是3.0.0的版本,protocolBuffer版本高了还不行,输入protoc --version,的确是3.0版本,只能重新安装,
进入https://github.com/google/protobuf页面,选择2.5版本的分支下载,然后进行安装,过程跟第4步一样,省略。
安装后,执行protoc --version显示还是3.0.0版本,只能寻找其他方式,下载包来安装。
wget protobuf.googlecode.com/files/protobuf-2.5.0.tar.bz2 tar jxvf protobuf-2.5.0.tar.bz2 cd protobuf-2.5.0 ./autogen.sh ./configure make make install
输入protoc --version,显示libprotoc 2.5.0,版本正确
接着运行mvn package -Pdist,native,src -DskipTests -Dtar,漫长等待后,还是失败,提示内存不足,搜索无果后,
再次查看BUILDING.txt文件,在中间有这么一段内容:
---------------------------------------------------------------------------------- Handling out of memory errors in builds ---------------------------------------------------------------------------------- If the build process fails with an out of memory error, you should be able to fix it by increasing the memory used by maven -which can be done via the environment variable MAVEN_OPTS. Here is an example setting to allocate between 256 and 512 MB of heap space to Maven export MAVEN_OPTS="-Xms256m -Xmx512m"
大意是说,如果内存不足,设置环境变量MAVEN_OPTS,增加内存,直接运行export MAVEN_OPTS="-Xms256m -Xmx512m"
接着再次编译,经过漫长等待后看到了,BUILD SUCCESS 的信息,说明编译成功,cd hadoop-dist/target能看到编译后的文件包,到此整个编译过程完成。
注意的几点:
1、在编译前,一定要把BUILDING.txt认真看一遍,免得出现不必要的错误,耽误时间。
2、protobuf是从protobuf.googlecode.com下载的,需要xx,已上传到附件中。
3、整个操作过程是用root用户来操作的。