前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住给大家分享一下。点击跳转到网站:https://www.captainai.net/dongkelun
前言
记录总结Hadoop源码编译打包过程,根据源码里的文档,一开始以为不支持在Windows系统上打包,只支持Unix和Mac,所以这里我在自己虚拟机centos7系统上编译,后来在文档后面部分才发现也支持在Windows上编译,不过还需要安装Visual Studio 2010,可能不如还不如在虚拟机上编译简单,如果想尝试在Windows上编译,可以看源码里的文档BUILDING.txt
中Building on Windows
的部分
代码
因之前没有下载过hadoop的源码,所以需要先下载hadoop的源码
1 | git clone https://github.com/apache/hadoop.git |
git命令克隆源码,克隆的过程中可能会有异常:
1 | error: unable to create file hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/monitor/capacity/mockframework/ProportionalCapacityPreemptionPolicyMockFramework.java: Filename too long |
因文件名过长,不能创建文件,只需要修改配置
1 | git config --global core.longpaths true |
删除clone失败的文件,重新clone就可以了,然后切换自己想要打包的版本分支,我这里使用的是分支3.3.1: branch-3.3.1
这里最好在虚拟机上clone代码,如果在Windows系统上克隆代码再上传到虚拟机上,则在编译打包时会出现脚本因行结尾字符不一致导致的问题,后面有说明解决方法
环境
BUILDING.txt
源码BUILDING.txt里,对必要环境依赖做了说明:
1 | ---------------------------------------------------------------------------------- |
已有环境依赖
- Unix System Centos7系统
- JDK1.8 开发常用 (1.8.0_45)
- Maven 3.3 or later 开发常用 (3.8.1)
- git (clone代码用)
- Python 3.8.0 (之前有使用需求,非必要)
- Node v12.16.3
Native libraries
可以看到如果要编译Hadoop Native libraries,需要安装很多依赖,如果选择不编译则会简单很多,这里选择编译,关于Hadoop Native libraries,大家如果有不懂的可以自己查资料了解
Hadoop源码文档里提供了Ubuntu 14.04的安装命令,因为这里是centos系统,将apt-get
改成yum
试一下
(其实也提供了centos的安装命令,不过是centos8,不知centos8和7的差别大不大,我没有再尝试,因为我已经安装完依赖并打包成功了)
1 | yum install -y build-essential autoconf automake libtool cmake zlib1g-dev pkg-config libssl-dev libsasl2-dev |
结果发现autoconf
和automake
已安装,build-essential zlib1g-dev pkg-config libssl-dev libsasl2-dev找不到相关的包,这样只安装了cmake
1 | No package build-essential available. |
但是cmake的版本为2.8:1
2$ cmake -version
cmake version 2.8.12.2
而所需要的版本是>=3.1 版本不符合,需要升级版本,网上查资料,记录安装过程:
升级cmake
首先卸载原先2.8版本的cmake1
yum -y remove cmake
下载cmakge的安装包:https://cmake.org/files/v3.23/cmake-3.23.0-rc1.tar.gz
解压1
tar -zxvf cmake-3.23.0-rc1.tar.gz
编译1
2cd cmake-3.23.0-rc1
./configure
编译过程中报以下异常:1
-- Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR (missing: OPENSSL_CRYPTO_LIBRARY OPENSSL_INCLUDE_DIR)
没有OpenSSL,上面的Requirements里也需要安装OpenSSL,那么先安装OpenSSL
1 | yum install openssl openssl-devel -y |
安装完后,重新编译cmake
编译成功后安装1
2make -j$(nproc) (比较慢)
sudo make install
安装完成后验证cmake版本:
1 | $ cmake -version |
参考:https://blog.csdn.net/qq_22938603/article/details/122964218
zlib
因按照文档上的命令很多依赖没有安装成功,那么我们单独尝试安装,这里发现zlib已经安装过了1
2$ yum list installed | grep zlib-devel
zlib-devel.x86_64 1.2.7-18.el7 @base
openssl
openssl 在升级cmake时也安装过了1
2$ yum list installed | grep openssl-devel
openssl-devel.x86_64 1:1.0.2k-25.el7_9 @updates
安装 Protocol Buffers 3.7.1
1 | curl -L -s -S https://github.com/protocolbuffers/protobuf/releases/download/v3.7.1/protobuf-java-3.7.1.tar.gz -o protobuf-3.7.1.tar.gz |
如果命令下载比较慢,也可以直接在浏览器上下载再上传,安装完成后验证一下protoc的版本
1 | $ protoc --version |
安装fuse
不清楚fuse_dfs是干啥的,这里也没用到,不过试着装了一下
1 | $ yum list installed | grep fuse |
1 | yum install -y fuse.x86_64 |
打包
到这里感觉自己所需要的依赖都已经装好了,先试一下,看一下有没有问题,这里第一次编译打包时需要下载很多依赖,比较慢,具体还依赖自己的网络环境
打包命令:
拷贝源码里的文档:
1 | ---------------------------------------------------------------------------------- |
根据自己的需求这里选择了下面的参数:
1 | mvn clean package -Pdist,native -DskipTests -Dtar |
异常1
1 | /root/workspace/hadoop/hadoop-project/../dev-support/bin/dist-copynativelibs: line 16: $'\r': command not found |
参考文章:https://blog.csdn.net/heihaozi/article/details/113602205
解决方法:1
2yum install -y dos2unix
dos2unix dev-support/bin/*
异常2
1 | [INFO] --- frontend-maven-plugin:1.11.2:yarn (yarn install) @ hadoop-yarn-applications-catalog-webapp --- |
这里说是因为node版本不匹配,需要版本”>= 12.0.0”,但是我本地node版本是v12.16.3,而且我没有编译for YARN UI v2 building,应该用不到node,但是这里确实报了异常,通过查看目录hadoop-yarn-applications-catalog-webapp/target/node
发现里面有yarn和node,所以文档上讲的有点问题,再打包hadoop-yarn-applications-catalog-webapp
也用到了node,但是应该不是我本地的node应该是源码里依赖自带的,那么去对应项目里的pom查找,果然有yarn和node的依赖,我们将<nodeVersion>v8.11.3</nodeVersion>
改为<nodeVersion>v12.16.3</nodeVersion>
再打包,果然成功解决了上面的异常,并打包成功(我不确定有没有不改代码就可以解决这个异常并打包成功的方法)
打包成功
编译打包过程比较漫长,需要下载110个项目的依赖,中间下载依赖时可能还会卡住,这里我选择停掉命令重新打包,尝试几次后,编译打包成功
1 | [INFO] ------------------------------------------------------------------------ |
成功截图: