自己动手编译hadoop-2.5.2源码
搭建环境:Centos x 6.5 64bit
(后来:我才知道原来官网上发布的就是64位的,不过这个对我来说是个学习过程,对以后进行其他平台编译的时候有帮助!)
1、安装JDK
我这里用的是64位机,要下载对应的64位的JDK,下载地址:http://www.oracle.com/technetwork/cn/java/javase/downloads/jdk7-downloads-1880260-zhs.html,
选择对应的JDK版本,解压JDK,然后配置环境变量,
- vi /etc/profile
注:这里有的人喜欢配置在当前用户里,我这里是配置的全局。
- export JAVA_HOME=/opt/jdk1.7
- export PATH=$PATH:$JAVA_HOME/bin
:wq 保持退出
source /etc/profile 是配置文件生效
测试下JDK是否安装成功: java -version
- java version "1.7.0_45"
- Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
- Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)
安装必要的软件
需要的软件:java, svn, autoconf, automake, libtool, ncurses-devel, openssl-devel, gcc, lzo-devel, zlib-devel, znt, maven, protobuf, cmake
sudo yum -y install gcc*
sudo yum -y install cmake
sudo yum -y install glibc-headers
sudo yum -y install gcc-c++
sudo yum -y install zip-devel
sudo yum -y install openssl-devel
sudo yum -y install svn
sudo yum -y install git
sudo yum -y install ncurses-devel
sudo yum -y install lzo-devel
sudo yum -y install autoconf
sudo yum -y install libtool
sudo yum -y install automake
这一堆东西都装上吧,省得编译过程中提示少这个,少那个
如果已安装,则跳过,如果没有安装,用命令:yum install svn进行安装,如:
$ yum install svn
如果yum命令安装失败(找不到相应的包),则需手动下载相应的软件包进行安装,比如maven, protobuf这两个个软件;
2、编译前的准备(maven)
maven官方下载地址,可以选择源码编码安装,这里就直接下载编译好的 就可以了
- wget http://mirror.bit.edu.cn/apache/maven/maven-3/3.1.1/binaries/apache-maven-3.1.1-bin.zip
解压文件后,同样在/etc/profie里配置环境变量
- export MAVEN_HOME=/opt/maven3.1.1
- export PATH=$PATH:$MAVEN_HOME/bin
验证配置是否成功: mvn -version
- Apache Maven 3.1.1 (0728685237757ffbf44136acec0402957f723d9a; 2013-09-17 23:22:22+0800)
- Maven home: /opt/maven3.1.1
- Java version: 1.7.0_45, vendor: Oracle Corporation
- Java home: /opt/jdk1.7/jre
- Default locale: en_US, platform encoding: UTF-8
- OS name: "linux", version: "2.6.32-358.el6.x86_64", arch: "amd64", family: "unix"
为了避免出现 maven-enforcer-plugin规则验证失败
编辑源代码根目录下的pom.xml,找到maven-enforcer-plugin所在的部分
应为我的jdk版本是:1.7的,需要在<profiles></profiles>内新添加- <profile>
- <id>jdk-1.7</id>
- <activation>
- <jdk>1.7</jdk>
- </activation>
- <repositories>
- <repository>
- <id>nexus</id>
- <name>local private nexus</name>
- <url>http://maven.oschina.net/content/groups/public/</url>
- <releases>
- <enabled>true</enabled>
- </releases>
- <snapshots>
- <enabled>false</enabled>
- </snapshots>
- </repository>
- </repositories>
- <pluginRepositories>
- <pluginRepository>
- <id>nexus</id>
- <name>local private nexus</name>
- <url>http://maven.oschina.net/content/groups/public/</url>
- <releases>
- <enabled>true</enabled>
- </releases>
- <snapshots>
- <enabled>false</enabled>
- </snapshots>
- </pluginRepository>
- </pluginRepositories>
- </profile>
(下面这个是针对你可能网路上访问受限,需要配置国内的镜像,这个根据个人吧,我配了反而失败了,在校园网中是不需要的。
由于maven国外服务器可能连不上,先给maven配置一下国内镜像,在maven目录下,conf/settings.xml,在<mirrors></mirros>里添加,原本的不要动
- <mirror>
- <id>nexus-osc</id>
- <mirrorOf>*</mirrorOf>
- <name>Nexusosc</name>
- <url>http://maven.oschina.net/content/groups/public/</url>
- </mirror>
对protoc进行编译安装前先要装几个依赖包:gcc,gcc-c++,make 如果已经安装的可以忽略
- yum install gcc
- yum intall gcc-c++
- yum install make
- tar -xvf protobuf-2.5.0.tar.bz2
- cd protobuf-2.5.0
- ./configure
- make && make install
别急,还不要着急开始编译安装,不然又是各种错误,需要安装cmake,openssl-devel,ncurses-devel依赖
- yum install cmake
- yum install openssl-devel
- yum install ncurses-devel
(下面这个我没有去改,应为我的版本里就有这个
而对于 2.2.0 的Source Code 压缩包解压出来的code有个bug 需要patch后才能编译。否则编译hadoop-auth 会提示下面错误:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.5.1:testCompile (default-testCompile) on project hadoop-auth: Compilation failure: Compilation failure: [ERROR] /home/chuan/trunk/hadoop-common-project/hadoop-auth/src/test/java/org/apache/hadoop/security/authentication/client/AuthenticatorTestCase.java:[84,13] cannot access org.mortbay.component.AbstractLifeCycle [ERROR] class file for org.mortbay.component.AbstractLifeCycle not found
在 /usr/release-2.5.2/hadoop-common-project/hadoop-auth/pom.xml文件中,添加以下内容:
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-util</artifactId>
<scope>test</scope>
</dependency>
安装ANT
wget http://mirror.bit.edu.cn/apache/ant/binaries/apache-ant-1.9.4-bin.tar.gz
tar zxvf apache-ant-1.9.4-bin.tar.gz -C /app
vi /etc/profile
export ANT_HOME=/app/apache-ant-1.9.4
PATH=$PATH:$ANT_HOME/bin
使其生效:source /etc/profile
Apache Ant(TM) version 1.9.4 compiled on April 29 2014
3、下载hadoop
这个地方你将会遇到各式各样的头疼问题
首先官方下载hadoop源码
- 下载方法一:
用svn下载hadoop-2.2.0源码,命令:
$ svn checkout 'http://svn.apache.org/repos/asf/hadoop/common/tags/release-2.5.2'
- 下载方法二:wget http://mirrors.cnnic.cn/apache/hadoop/common/hadoop-2.5.2/hadoop-2.5.2-src.tar.gz
- mvn package -Pdist,native -DskipTests -Dtar
现在慢慢等吧!
- [INFO] ------------------------------------------------------------------------
- [INFO] Reactor Summary:
- [INFO]
- [INFO] Apache Hadoop Main ................................ SUCCESS [3.709s]
- [INFO] Apache Hadoop Project POM ......................... SUCCESS [2.229s]
- [INFO] Apache Hadoop Annotations ......................... SUCCESS [5.270s]
- [INFO] Apache Hadoop Assemblies .......................... SUCCESS [0.388s]
- [INFO] Apache Hadoop Project Dist POM .................... SUCCESS [3.485s]
- [INFO] Apache Hadoop Maven Plugins ....................... SUCCESS [8.655s]
- [INFO] Apache Hadoop Auth ................................ SUCCESS [7.782s]
- [INFO] Apache Hadoop Auth Examples ....................... SUCCESS [5.731s]
- [INFO] Apache Hadoop Common .............................. SUCCESS [1:52.476s]
- [INFO] Apache Hadoop NFS ................................. SUCCESS [9.935s]
- [INFO] Apache Hadoop Common Project ...................... SUCCESS [0.110s]
- [INFO] Apache Hadoop HDFS ................................ SUCCESS [1:58.347s]
- [INFO] Apache Hadoop HttpFS .............................. SUCCESS [26.915s]
- [INFO] Apache Hadoop HDFS BookKeeper Journal ............. SUCCESS [17.002s]
- [INFO] Apache Hadoop HDFS-NFS ............................ SUCCESS [5.292s]
- [INFO] Apache Hadoop HDFS Project ........................ SUCCESS [0.073s]
- [INFO] hadoop-yarn ....................................... SUCCESS [0.335s]
- [INFO] hadoop-yarn-api ................................... SUCCESS [54.478s]
- [INFO] hadoop-yarn-common ................................ SUCCESS [39.215s]
- [INFO] hadoop-yarn-server ................................ SUCCESS [0.241s]
- [INFO] hadoop-yarn-server-common ......................... SUCCESS [15.601s]
- [INFO] hadoop-yarn-server-nodemanager .................... SUCCESS [21.566s]
- [INFO] hadoop-yarn-server-web-proxy ...................... SUCCESS [4.754s]
- [INFO] hadoop-yarn-server-resourcemanager ................ SUCCESS [20.625s]
- [INFO] hadoop-yarn-server-tests .......................... SUCCESS [0.755s]
- [INFO] hadoop-yarn-client ................................ SUCCESS [6.748s]
- [INFO] hadoop-yarn-applications .......................... SUCCESS [0.155s]
- [INFO] hadoop-yarn-applications-distributedshell ......... SUCCESS [4.661s]
- [INFO] hadoop-mapreduce-client ........................... SUCCESS [0.160s]
- [INFO] hadoop-mapreduce-client-core ...................... SUCCESS [36.090s]
- [INFO] hadoop-yarn-applications-unmanaged-am-launcher .... SUCCESS [2.753s]
- [INFO] hadoop-yarn-site .................................. SUCCESS [0.151s]
- [INFO] hadoop-yarn-project ............................... SUCCESS [4.771s]
- [INFO] hadoop-mapreduce-client-common .................... SUCCESS [24.870s]
- [INFO] hadoop-mapreduce-client-shuffle ................... SUCCESS [3.812s]
- [INFO] hadoop-mapreduce-client-app ....................... SUCCESS [15.759s]
- [INFO] hadoop-mapreduce-client-hs ........................ SUCCESS [6.831s]
- [INFO] hadoop-mapreduce-client-jobclient ................. SUCCESS [8.126s]
- [INFO] hadoop-mapreduce-client-hs-plugins ................ SUCCESS [2.320s]
- [INFO] Apache Hadoop MapReduce Examples .................. SUCCESS [9.596s]
- [INFO] hadoop-mapreduce .................................. SUCCESS [3.905s]
- [INFO] Apache Hadoop MapReduce Streaming ................. SUCCESS [7.118s]
- [INFO] Apache Hadoop Distributed Copy .................... SUCCESS [11.651s]
- [INFO] Apache Hadoop Archives ............................ SUCCESS [2.671s]
- [INFO] Apache Hadoop Rumen ............................... SUCCESS [10.038s]
- [INFO] Apache Hadoop Gridmix ............................. SUCCESS [6.062s]
- [INFO] Apache Hadoop Data Join ........................... SUCCESS [4.104s]
- [INFO] Apache Hadoop Extras .............................. SUCCESS [4.210s]
- [INFO] Apache Hadoop Pipes ............................... SUCCESS [9.419s]
- [INFO] Apache Hadoop Tools Dist .......................... SUCCESS [2.306s]
- [INFO] Apache Hadoop Tools ............................... SUCCESS [0.037s]
- [INFO] Apache Hadoop Distribution ........................ SUCCESS [21.579s]
- [INFO] Apache Hadoop Client .............................. SUCCESS [7.299s]
- [INFO] Apache Hadoop Mini-Cluster ........................ SUCCESS [7.347s]
- [INFO] ------------------------------------------------------------------------
- [INFO] BUILD SUCCESS
- [INFO] ------------------------------------------------------------------------
- [INFO] Total time: 11:53.144s
- [INFO] Finished at: Fri Nov 22 16:58:32 CST 2013
- [INFO] Final Memory: 70M/239M
- [INFO] ------------------------------------------------------------------------
直到看到上面的内容那就说明编译完成了。
编译后的路径在:hadoop-2.5.2-src/hadoop-dist/target/hadoop-2.5.2
- [root@localhost bin]# ./hadoop version
- Hadoop 2.5.2
- Subversion Unknown -r Unknown
- Compiled by root on 2013-11-22T08:47Z
- Compiled with protoc 2.5.0
- From source with checksum 79e53ce7994d1628b240f09af91e1af4
- This command was run using /data/hadoop-2.5.2-src/hadoop-dist/target/hadoop-2.5.2/share/hadoop/common/hadoop-common-2.5.2.jar
可以看出hadoop的版本是多少位的: file lib//native/*

注意红色字体部分,如果下载官网的编译好的包,这里显示的是32-bit。
首次编译一般不会成功(视人品而定),下面是可能会遇到的一些问题:
a) maven-enforcer-plugin规则验证失败
编辑源代码根目录下的pom.xml,找到maven-enforcer-plugin所在的部分
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>1.3.1</version>
<configuration>
<rules>
<requireMavenVersion>
<version>[3.0.2,)</version>
</requireMavenVersion>
<requireJavaVersion>
<version>1.7</version>
</requireJavaVersion>
</rules>
</configuration>
</plugin>
注意红色部分,原来的值是1.6,即规定了使用jdk1.6,如果本机安装的jdk是1.7,这里相应改一下
b)maven-antrun-plugin各种报错
同样尝试修改pom.xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.7</version>
<dependencies>
<dependency>
<groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-utils</artifactId>
<version>2.0.5</version>
</dependency>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant</artifactId>
<version>1.9.4</version>
</dependency>
</dependencies>
</plugin>
红色这一部分是原来没有的,可以尝试加上再试试,其中ant依赖项的版本号,调整成本机实际的ant版本号
c) org.slf4j系列jar包找不到的问题
hadoop所依赖的org.slf4j这一系列的Jar包版本都特别低,如果maven无法自动从互联网下载成功,可以手动根据出错信息,到网上下载这些jar包,然后放到本地仓库的相关目录
d) apache-tomcat-6.0.41.tar.gz 下载太卡的问题
[get] Getting: http://archive.apache.org/dist/tomcat/tomcat-6/v6.0.41/bin/apache-tomcat-6.0.41.tar.gz
[get] To: /home/cargo/hadoop-2.6.0-src/hadoop-common-project/hadoop-kms/downloads/apache-tomcat-6.0.41.tar.gz
到这一步时,如果下载失败,可以手动下载这个包,然后放到 hadoop-2.6.0-src/hadoop-common-project/hadoop-kms/downloads/ 目录下
e)内存不足
export MAVEN_OPTS="Xms256m -Xmx512m"
把这一行加到最开始设置环境变量的文件最后即可
再次配置完了,需要将上次的操作clean掉
- cd hadoop2.5.2-src
- mvn clean install –DskipTests
调侃一下: 可能是不同机器网络等问题,别灰心,看看报的啥错误,一点点的解决 ,
上面这些招数用尽后,仍然各种报错,可以尝试把maven命令调整成
mvn compile -DskipTests -Pdist,native -Dtar
即先不打包,仅编译
补充一下:
1. Maven是一个软件项目管理和综合工具。基于项目对象模型(POM)的概念,Maven可以从一个中心资料片管理项目构建,报告和文件。
Maven是什么?
Maven是一个项目管理和综合工具。Maven提供了开发人员构建一个完整的生命周期框架。开发团队可以自动完成项目的基础工具建设,Maven使用标准的目录结构和默认构建生命周期。
在多个开发团队环境时,Maven可以设置按标准在非常短的时间里完成配置工作。由于大部分项目的设置都很简单,并且可重复使用,Maven让开发人员的工作更轻松,同时创建报表,检查,构建和测试自动化设置。
2. Protocol
Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式。它可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前提供了 C++、Java、Python 三种语言的 API。
3.svn
SVN
SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS、CVS,它采用了分支管理系统,它的设计目标就是取代CVS。互联网上很多版本控制服务已从CVS迁移到Subversion。
( Subversion:颠覆;破坏)
4.cmake
cmake
CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。只是 CMake 的组态档取名为 CmakeLists.txt。Cmake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再依一般的建构方式使用。这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的软件,这种可以使用各平台的原生建构系统的能力是 CMake 和 SCons 等其他类似系统的区别之处。
5.Any
Apache Ant,是一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发。由Apache软件基金会所提供。
6.libtool
libtool
GNU libtool 是一个通用库支持脚本,将使用动态库的复杂性隐藏在统一、可移植的接口中。
可以利用libtool自动生成动态库的Makefile
libtool 提供通用的库编译支持。
libtoolize 提供了一种标准方式来将libtool支持加入到一个软件包。
libltdl 隐藏 dlopening 库的复杂细节。
以前,如果源代码包的开发者要利用共享库的优点,则必须为每个软件包可支持的平台编写 定制的支持代码。并且还需要设计配置接口,以便软件包的安装程序能够正确选择要建立的 库类型。利用 GNU Libtool,则可以简化开发者的这一工作。它在一个单独的脚本中同时封装 了与平台相关的依赖性以及用户界面。GNU Libtool 可使每个宿主类型的完整功能可通过 一般性的接口获得,同时为程序员隐藏了宿主的特殊性。GNU Libtool 一致性接口是可靠的, 用户不必阅读那些晦涩的文档,以便在每个平台上建立共享库。他们只需运行软件包的配置 脚本,而由 libtool 完成繁复的工作。

浙公网安备 33010602011771号