1.1 Hadoop编译环境构建
1.1.1 系统信息
Linux版本:
1.1.2 编译环境准备
1.1.2.1 安装jdk7.0
rpm -ivh jdk-7u2-linux-x64.rpm
vim /etc/profile
export JAVA_HOME=/usr/java/jdk1.7.0
export JRE_HOME=/usr/java/jdk1.7.0/jre
exportPATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
exportCLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
注:修改完/etc/profile文件之后,需执行source /etc/profile
1.1.2.2 安装maven
tar -zxvfapache-maven-3.1.1-bin.tar.gz
vim /etc/peofile
exportM2_HOME=/usr/local/apache-maven-3.1.1
exportPATH=$PATH:$JAVA_HOME/bin:$M2_HOME/bin
做完以上设置以后执行source/etc/profile,然后使用mvn –v查看maven是否安装成功,如果出现以下信息:
则说明maven安装成功了。
1.1.2.3 安装findbugs
tar zxvf findbugs-3.0.0.tar.gz
vim /etc/profile
export FINDBUGS_HOME=/usr/local/findbugs-3.0.0
export PATH=$PATH:$FINDBUGS_HOME/bin
1.1.2.4 安装protobuf
tar zxvf protobuf-2.5.0.tar.gz
cd protobuf-2.5.0
./configure
make
make install
检测 protoc --version
1.1.2.5 安装cmake
tar zxvf cmake-2.8.7.tar.gz
cd cmake-2.8.7
./bootstrap
gmake
gmake install
检查安装 whichcmake看结果可知安装是否正确
1.1.2.6 安装与使用git
本来是否安装git与编译Hadoop源码没有直接的关系,如果已经获取到源码,则可以跳过该环节;但在大多数项目开发中,我们都是采用git来进行版本控制,并且Hadoop社区都是采用git来进行版本管理的,所以在此处有必要介绍一下git的安装与使用。
Git的安装:在git官网(http://git-scm.com/download)下载git的最新版本,或者在https://www.kernel.org/pub/software/scm/git/中选择下载git的各历史版本,例如我下载的是git-2.6.4.tar.gz版本;将其拷贝到Linux环境中,并使用tar –xvf git-2.6.4.tar.gz命令将其解压缩,如下所示:
然后执行以下命令安装git:
cd git-2.6.4
./configure
make
make install
安装成功之后执行git--version查看安装的git版本。
到此为止则可以使用git命令下载git服务器上的代码了,如下所示:
$ git clone git@code.baidu.com:z00123456/baidu-hadoop.git
remote:Counting objects: 21205, done.
remote:Compressing objects: 100% (9921/9921), done.
Receivingobjects: 13% (2820/21205), 150.57 MiB |667.00 KiB/s
1.1.3 编译Hadoop源码
tar zxvf hadoop-2.7.1-src.tar.gz
cd hadoop-2.7.1-src
mvn clean [非必要操作]
mvn package -Pdist,native,docs,src-DskipTests –Dtar
(或者mvn clean package -Pdist,native -DskipTests=true-Dmaven.javadoc.skip=true)
最后的文件就在hadoop-2.7.1-src/hadoop-dist/target目录中:
至此,已经完成hadoop-2.7.1的编译。
1.1.4 编译Hadoop常见问题
1.1.4.1 未装findbugs
当未安装findbugs时会报以下错误:
解决方式:安装findbugs
1.1.4.2 提示缺少apache-tomcat-6.0.41.tar.gz包
问题现象如下:
解决方式:下载apache-tomcat-6.0.41.tar.gz包,并将其拷贝到hadoop源码的以下路径下:
hadoop-2.7.1-src/hadoop-common-project/hadoop-kms/downloads
hadoop-2.7.1-src/hadoop-hdfs-project/hadoop-hdfs-httpfs/downloads
1.1.4.3 未安装openssl-devel
在安装完cmake之后编译还报以下错误:
在网上查资料,很多人说是缺少zlib1g-dev与libssl-dev两个库;但有一个兄弟说安装openssl-devel之后就编译成功了,所以我试了试安装openssl-devel,果然就没有再报上面的错了。
openssl-devel安装:我采用的是挂载RedHa6t安装盘,使用yum命令的安装方式,具体做法如下:
-
利用BMC挂载镜像文件rhel-server-6.2-x86_64-dvd.iso
注:我装的是redhat6.2所以挂载该镜像文件,大家可根据自己安装的Linux版本挂载相应的镜像文件
-
在linux中创建一个目录,然后把镜像文件挂载到该目录上,例如:
mkdir /aa mount/dev/cdrom /aa
-
修改/etc/yum.repos.d目录下的配置文件rhel-source.repo,例如:
-
利用yum命令安装openssl-devel,如下所示:
yum install openssl-devel
-
查看是否安装成功
yum list openssl-devel
注:还有一个比较实用的命令,可以查找镜像文件中是否有某个安装包,例如:
yum search gcc //查找镜像文件中是否有gcc
1.1.4.4 配置外网访问
机房里的服务器大多数是访问不了外网的,只有少数服务器配置了大网IP;而编译hadoop源代码又需要连接互联网(Maven要从代码库中下载依赖包),所以当在一台没有大网IP的服务器中编译hadoop源码时,则可以通过设置网络跳转来达到访问外网的目的。
要想达到访问外网的目的,需在Linux环境上做如下设置:
(1) 修改/etc/profile配置文件,新增以下配置项:
其中169.10.35.238为PC机上配置的机房小网IP地址,3128为网络跳转软件squid的默认使用端口(需在PC安装配置该软件)
(2) 将在Linux环境的maven的配置文件settings.xml中增加以下配置:
<proxy>
<id>optional</id>
<active>true</active>
<protocol>http</protocol>
<username></username>
<password></password>
<host>169.10.35.238</host>
<port>3128</port>
<nonProxyHosts>local.net|some.host.com</nonProxyHosts>
</proxy>
(3) 拷贝wagon-http-lightweight-2.2.jar软件包到maven的安装路径下的ext目录下,例如:
注:该步骤是否为必须项还需确认
除此以外,还需在PC机上安装以及配置squid软件
(1) 直接解压缩squid.zip到C:\squid
(2) 到C:\squid\etc目录下,复制squid.conf.default为squid.conf,mime.conf.default为mime.conf,cachemgr.conf.default为cachemgr.conf。如果有特殊的配置要求,可以修改squid.conf,squid的默认端口是3128
(3) 修改squid.conf文件的如下配置项,使其可用父级代理(华为代理):
cache_peer proxy.huawei.com parent 8080 0 no-queryno-digest login=域用户:密码
(4) 服务安装与初始化,到c:\squid\sbin目录下,执行以下命令:
安装服务:squid –i
初始化缓存目录结构:squid–z
重启机器或者命令行执行“net start squid”启动服务,然后即可通过代理访问外网
1.2 构建HDFS源代码阅读环境
在Hadoop官网上下载的源码包hadoop-2.7.1-src.tar.gz,解压之后是一个maven工程,如下所示:
其中的Yarn、HDFS以及common等子模块也都是maven工程。
我们可以使用IntelliJIDEA或eclipse来导入hadoop源码,以供阅读与二次开发
(1) 使用eclipse导入Hadoop源码:
因为我阅读与二次开发的是HDFS模块,所以我只导入了HDFS子模块的源代码,如下所示:
即直接把Hadoop源码的子模块hadoop-hdfs-project当做一个maven工程导入即可,导入之后代码会报一些错,主要原因是缺少一些*Protos.java与*Proto.java文件,这些文件是在编译Hadoop源码时才生成的,所以需要到自行编译好的源码中(3.1有介绍)找到这些Proto文件,并拷贝到导入模块的相应目录下。
可以通过以下方式,在编译好的源码中找到Proto文件:
(2) IntelliJ IDEA导入Hadoop源码:
使用idea导入Hadoop源码就更方便了,直接把整个Hadoop工程当做maven工程导入即可,因为idea对maven工程有更好的支持,所以熟练使用idea IDE的人基本会选择使用idea进行Hadoop的二次开发,导入情况如下所示:
如上图所示,Hadoop源码在idea中展示非常清晰,均是Hadoop的子模块来划分目录的,这样导入之后还是会缺少上面提到的Proto文件,其实缺少这些文件根本不影响阅读Hadoop源码,对基于Hadoop的二次开发也没什么影响,因为二次开发很少会涉及改动Proto文件。