Hadoop编译安装

标签: 大数据 分类: 大数据 创建时间:2019-12-28 05:07:52 更新时间:2023-10-20 11:23:25

在安装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
2
3
4
5
yum -y install gcc
yum install -y bzip2-devel
yum -y install gcc-c++
yum install make
yum install autoconf automake libtool cmake ncurses-devel openssl-devel gcc*

2.安装JDK

这里就不测试了,因为我已经安装了。

3.安装Maven

(1) 下载Maven

(2) 解压到/usr/local/maven3.6.3

(3) 设置环境变量

1
2
3
MAVEN_HOME=/usr/local/maven3.6.3
export MAVEN_HOME
export PATH=$PATH:$MAVEN_HOME/bin

(4) 重载配置文件

1
source /etc/profile

(5) 配置阿里云镜像

1
2
3
4
5
6
7
8
9
## 编辑settings
vi /usr/local/maven3.6.3/conf/settings.xml
## 在<mirrors>节点中添加
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>

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
2
3
4
5
6
7
8
## 编辑
vi /etc/profile

## 添加变量
export PATH=$PATH:/usr/local/protoc/bin

## 重载
source /etc/profile

(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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
## 进入解压后的目录
cd hadoop-3.2.1-src
## 添加阿里云maven镜像
vi pom.xml
## 在repositories下添加如下内容
<repositories>
<repository>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>

## 编译
mvn package -Pdist,native -DskipTests -Dtar

增加了阿里云的镜像,有时候也会在编译下载的时候卡住,使用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
2
3
4
5
6
7
8
## 解压
tar -xvf protobuf-2.5.0.tar.gz
## 进入目录
cd protobuf-2.5.0.tar.gz
## 编译
./configure --prefix=/usr/local/protoc/
## 安装
make && make install

(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
3
4
## 查看版本
cmake --version
## 卸载
yum remove cmake

(2) 下载cmake

(3) 解压

1
tar -xvf cmake-3.16.2.tar.gz

(4) 编译安装

1
2
3
4
## 进入目录
cd cmake-3.16.2
## 编译
./bootstrap

出现问题:Cannot find a C++ compiler that supports both C++11 and the specified C++ flags.

查看gcc版本:

只有4.7之后的gcc才支持c++ 11,那就只能先升级gcc了。

(5) 升级gcc

1
2
3
4
5
6
7
8
9
10
yum install centos-release-scl -y
yum install devtoolset-7 -y
scl enable devtoolset-7 bash
## 查看版本
gcc --version
## 注释:
## 在centos的devtoolset库中 最新的为 devtoolset-7,所以我们以后可以自己改数字安装最新的版本
## scl enable devtoolset-7 bash 如果使用的是zsh则使用
## scl enable devtoolset-7 zsh
## 如果不知道什么是zsh那么默认的就好了

(6) 重新编译cmake

1
./bootstrap --prefix=/usr/local/cmake/

(7) 安装

1
2
gmake
gmake install

(8) 建立软连接,或者配置PATH环境变量
如果在编译的时候没有指定–prefix属性,那就建立软连接,如果指定了,那就将/usr/local/cmake/bin添加入PATH中

1
2
3
4
5
6
## 建立软连接
ln -s /usr/local/bin/cmake /usr/bin/
## 加入PATH
vi /etc/profile

export PATH=$PATH:/usr/local/cmake/bin

(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
2
3
mvn package -Pdist,native -DskipTests -Dtar
## 替换为
mvn clean && mvn package -Pdist,native,docs -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环境变量之后,还真的编译通过了。

[4] Failed to execute goal org.apache.maven.plugins:maven-antrun-plugin:1.7:run (pre-site) on project hadoop-common
上个问题解决了,出现了新的问题。

1
2
3
[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, 没有那个文件或目录
[ERROR] around Ant part ...<exec input="dev-support/jdiff-workaround.patch" dir="/root/soft/hadoop-3.2.1-src/hadoop-common-project/hadoop-common" executable="patch">... @ 4:141 in /root/soft/hadoop-3.2.1-src/hadoop-common-project/hadoop-common/target/antrun/build-main.xml

(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
2
3
4
## 进入hadoop源码目录,编辑hadoop-client-modules/pom.xml
vim hadoop-client-modules/pom.xml
## 将<module>hadoop-client-check-test-invariants</module>注释掉
<module>hadoop-client-check-test-invariants</module>

然后将编译命令改为:

1
mvn -X package -Pdist,native,docs -DskipTests -Dtar -Dmaven.skip.test=true -Dmaven.javadoc.skip=true
参考文章:
1.mac下编译hadoop-3.0.3 (根据这篇文章,最后成功了)
2.编译hadoop3.0.2 enforce-banned-dependencies失败

[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
2
3
4
5
6
7
<repository>
<id>repository.jboss.org</id>
<url>https://repository.jboss.org/nexus/content/groups/public/</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。