Hadoop编译安装
在安装hadoop的时候,总是出现:WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable,很多地方说是因为安装包的版本不兼容,不影响hadoop的功能,本着探究的精神,我还是选择了编译安装hadoop。我的测试环境是:CentOS6.5 64位系统,hadoop版本是3.2.1。
1.安装gcc
1 | yum -y install gcc |
2.安装JDK
这里就不测试了,因为我已经安装了。
3.安装Maven
(1) 下载Maven
(2) 解压到/usr/local/maven3.6.3
(3) 设置环境变量
1 | MAVEN_HOME=/usr/local/maven3.6.3 |
(4) 重载配置文件
1 | source /etc/profile |
(5) 配置阿里云镜像
1 | ## 编辑settings |
4.安装protobuf
这里最好使用2.5.0 版本的,否则会出现问题一中的问题
(1) 下载protoc-3.11.2-linux-x86_64.zip
(2) 解压到指定目录
1 | unzip protoc-3.11.2-linux-x86_64.zip -d /usr/local/protoc |
(3) 在PATH环境变量中添加protoc目录
1 | ## 编辑 |
(4) 测试
1 | protoc --help |
5.编译hadoop
(1) 下载hadoop-3.2.1-src.tar.gz源码
(2) 解压
1 | tar -xvf hadoop-3.2.1-src.tar.gz |
(3) 编译hadoop
1 | ## 进入解压后的目录 |
增加了阿里云的镜像,有时候也会在编译下载的时候卡住,使用Ctrl+C停止编译,然后重新编译,就会继续进行编译和下载。
6.总结
解决了下面一系列的问题:
(1) hadoop3.0.x需要cmake3.x,升级cmake为3.x和gcc为7+
(2) 安装probuf2.5.0版本并配置PROTOBUF_HOME环境变量;
(4) 就是注释掉pom.xml中的jboss仓库地址,jboss有时候连不上;
(5) 注释掉hadoop-client-modules/pom.xml中的:<module>hadoop-client-check-test-invariants</module>
(6) 使用编译命令:mvn -X package -Pdist,native,docs -DskipTests -Dtar -Dmaven.skip.test=true -Dmaven.javadoc.skip=true
(7) 编译结果在:hadoop-3.0.1-src/hadoop-dist/target目录下
最后编译成功了:
问题
[1].org.apache.maven.plugin.MojoExecutionException: protoc version is ‘libprotoc 3.11.2’, expected version is ‘2.5.0’
既然已经说了要2.5.0的protoc,那就下载,替换掉最新的3.11.2
(1) 下载
(2) 删除原先的protoc
1 | rm -rf /usr/local/protoc/ |
(3) 编译2.5.0版本
1 | ## 解压 |
(4) 配置环境变量
将/usr/local/protoc/bin,加入PATH中。由于我前面已经配置过了,就不用再配了。
(5) 测试
1 | protoc --version |
[2].Failed to execute goal org.apache.hadoop:hadoop-maven-plugins:3.2.1:cmake-compile (cmake-compile) on project hadoop-common
第一个问题解决了,第二个问题出现了。根据参考资料,需要升级cmake,参考文章2中说,要安装hadoop3以上,需要:CMake 3.1 or higher is required. You are running version 2.8.12.2
(1) 卸载原先的cmake
1 | ## 查看版本 |
(2) 下载cmake
(3) 解压
1 | tar -xvf cmake-3.16.2.tar.gz |
(4) 编译安装
1 | ## 进入目录 |
出现问题:Cannot find a C++ compiler that supports both C++11 and the specified C++ flags.
查看gcc版本:
只有4.7之后的gcc才支持c++ 11,那就只能先升级gcc了。
1.安装cmake过程出错:Error when bootstrapping CMake: Cannot find a C++ compiler that supports both C++11 and the specified C++ flags.
2.Compile error: Cannot find a C++ compiler that supports both C++11 and the specified C++ flags
3.yum安装g++
4.哪个版本的gcc才支持c11
5.cmake 指定 gcc 版本
6.Centos7安装高版本Cmake
7.使用yum安装cmake
(5) 升级gcc
1 | yum install centos-release-scl -y |
(6) 重新编译cmake
1 | ./bootstrap --prefix=/usr/local/cmake/ |
(7) 安装
1 | gmake |
(8) 建立软连接,或者配置PATH环境变量
如果在编译的时候没有指定–prefix属性,那就建立软连接,如果指定了,那就将/usr/local/cmake/bin添加入PATH中
1 | ## 建立软连接 |
(9) 验证安装
1 | cmake -version |
[3] Failed to execute goal org.apache.hadoop:hadoop-maven-plugins:3.2.1:cmake-compile (cmake-compile) on project hadoop-hdfs-native-client: CMake failed with error code 1
(1) 切换命令
1 | mvn package -Pdist,native -DskipTests -Dtar |
结果还是报错。
(2) 向上查看日志,出现了Could NOT find Protobuf (missing: Protobuf_INCLUDE_DIR)警告
我觉得应该是这里的问题。
(3) 添加环境变量:PROTOBUF_HOME
几经周折,还是没有在网上找到具体的答案,于是我查看了出错的地方,在hadoop源码下的:hadoop-hdfs-project\hadoop-hdfs-native-client\src\main\native\libhdfspp\CMakeLists.txt,这个文件,错误就出在这里。我观察到,这里面有个有个查找包文件的地方:
然后还有一个变量为:PROTOBUF_HOME
本着死马当活马医的精神,于是,我在/etc/profile中添加了一个PROTOBUF_HOME变量,只想我编译安装protoc的目录
1 | export PROTOBUF_HOME=/usr/local/protoc |
(4) 再次运行编译打包
设置PROTOBUF_HOME环境变量之后,还真的编译通过了。
1.hadoop源码研究 编译错误记录
2.cmake cannot find PROTOBUF
3.Could NOT find Protobuf (missing: Protobuf_INCLUDE_DIR)
4.Could not find PROTOBUF Compiler
5.Centos7安装protobuf
6.protobuf-compiler-2.5.0-8.el7.x86_64.rpm
[4] Failed to execute goal org.apache.maven.plugins:maven-antrun-plugin:1.7:run (pre-site) on project hadoop-common
上个问题解决了,出现了新的问题。
1 | [ERROR] Failed to execute goal org.apache.maven.plugins:maven-antrun-plugin:1.7:run (pre-site) on project hadoop-common: An Ant BuildException has occured: Execute failed: java.io.IOException: Cannot run program "patch" (in directory "/root/soft/hadoop-3.2.1-src/hadoop-common-project/hadoop-common"): error=2, 没有那个文件或目录 |
(1) 尝试执行:yum install patch
[5] Failed to execute goal org.apache.maven.plugins:maven-enforcer-plugin:3.0.0-M1:enforce (enforce-banned-dependencies) on project hadoop-client-check-test-invariants: Some Enforcer rules have failed. Look above for specific messages explaining why the rule failed.
看提示的最后,就是让我们移除掉:hadoop-client-check-test-invariants
1 | mvn clean && mvn package -Pdist,native,docs -DskipTests -Dtar -rf :hadoop-client-check-test-invariants |
更新
经过多次尝试,最后终于编译成功了。
1 | ## 进入hadoop源码目录,编辑hadoop-client-modules/pom.xml |
然后将编译命令改为:
1 | mvn -X package -Pdist,native,docs -DskipTests -Dtar -Dmaven.skip.test=true -Dmaven.javadoc.skip=true |
[6] Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.3.1:exec (dist) on project hadoop-dist: Command execution failed
又出现了新的问题。
再向上找出现了: 无法获取”/root/soft/hadoop-3.2.1-src/hadoop-hdfs-project/hadoop-hdfs-httpfs/target/hadoop-hdfs-httpfs-3.2.1/*” 的文件状态(stat): 没有那个文件或目录
更新
在解决了上面的问题5之后,问题6也自动解决了。
[7] 安装时,下载jar包总是卡住
删除pom.xml中的下列参考,因为jboss好像访问不到了。
1 | <repository> |