官方提供的hadoop-2.x版本貌似都是32位的,在64位機子下使用可能會報錯,最好使用官方提供的源碼進行本地編譯,編譯成適合本地硬件環境的64位軟件包。
Hadoop是使用Java語言開發的,但是有一些需求和操作並不適合使用java,所以就引入了本地庫(Native Libraries)的概念,通過本地庫,Hadoop可以更加高效地執行某一些操作。
native位於hadoop-2.x.x/lib/native目錄下,僅支持linux和unix操作系統。
hadoop中的zlib和gzip模塊會加載本地庫,如果加載失敗,會提示:WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
可以在core-site.xml中配置hadoop.native.lib值是否使用本地庫,默認值為true。
官方提供的hadoop-2.x版本中,native文件都是32位編譯的,在實際使用64位環境中,建議本地編譯后再使用。
參考:http://hadoop.apache.org/docs/r2.6.0/hadoop-project-dist/hadoop-common/NativeLibraries.html
本次編譯環境:CentOS 5.5 + jdk7 + hadoop-2.6.0-src.tar.gz。為了加快編譯過程,盡量將CentOS的內存設置的大一些,還有,編譯過程中CentOS必須保持連網狀態。
1、安裝JDK、maven、findbugs(可選步驟)
實驗版本:jdk-7u75-linux-x64.tar.gz、apache-maven-3.0.5-bin.tar.gz、findbugs-3.0.0.tar.gz,分別解壓到/usr/local目錄下,然后配置環境變量:vi /etc/profile,配置內容如下:

export JAVA_HOME=/usr/local/jdk1.7.0_75
export MAVEN_HOME=/usr/local/apache-maven-3.0.5/
export FINDBUGS_HOME=/usr/local/findbugs-3.0.0/
export PATH=.:$MAVEN_HOME/bin:$JAVA_HOME/bin:$FINDBUGS_HOME/bin:$PATH
驗證:① java -version;② mvn -version;③ findbugs -version。
2、安裝protoc
protoc buffer是hadoop的通信工具,編譯過程需要安裝。實驗版本:protobuf-2.5.0.tar.gz,官網:https://code.google.com/p/protobuf/downloads/list。
安裝編譯工具:① yum install -y gcc;② yum intall -y gcc-c++;③ yum install -y make,操作系統已安裝的不必重復安裝。
進入/usr/local,順序執行命令:① tar -zxvf protobuf-2.5.0.tar.gz;② cd protobuf-2.5.0;③ ./configure --prefix=/usr/local/protoc/;④ make && make install。
安裝完成后,配置環境變量,增加:export PROTOC_HOME=/usr/local/protoc/,和export PATH=..:$PROTOC_HOME/bin:..
驗證:protoc --version
3、安裝其他依賴
執行命令:① yum install -y cmake;② yum install -y openssl-devel;③ yum install -y ncurses-devel。
4、開始編譯工作
從官網下載需要編譯的hadoop源碼版本,本次實驗:hadoop-2.6.0-src.tar.gz,官網下載:http://archive.apache.org/dist/hadoop/core/stable/。
進入/usr/local,執行解壓操作:tar -zxvf hadoop-2.6.0-src.tar.gz,然后修改一個hadoop-2.x共有的bug(詳見https://issues.apache.org/jira/browse/HADOOP-10110),編輯文件:usr/local/hadoop-2.6.0-src/hadoop-common-project/hadoop-auth/pom.xml,第55行左右增加如下內容:

<dependency> <groupId>org.mortbay.jetty</groupId> <artifactId>jetty-util</artifactId> <scope>test</scope> </dependency>
然后進入目錄/usr/local/hadoop-2.6.0-src中,執行命令:mvn package -DskipTests -Pdist,native,docs,其中docs根據需要添加。
編譯大概需要二三十分鍾,看到一堆的SUCCESS,說明編譯成功,編譯后的項目在hadoop-2.6.0-src/hadoop-dist/target/hadoop-2.6.0中。
只需要將編譯后項目中的/hadoop-dist/lib/native文件夾覆蓋至之前32位的項目中即可(當然整個項目覆蓋也可以),並在配置文件$HADOOP_HOME/etc/hadoop/hadoop-env.sh末尾添加:export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib:$HADOOP_HOME/lib/native"。