Hadoop集群搭建
这篇文章详细记录了如何在三台CentOS7服务器上搭建一个稳定运行的Hadoop集群。
首先,从环境准备开始,作者列举了完成集群部署所需的基础配置,包括关闭防火墙、配置免密登录、时钟同步以及安装JDK环境等操作,确保每台服务器都满足集群运行的条件。
接着,根据集群角色分配规则,作者对Hadoop的核心配置文件进行了详细的修改,包括core-site.xml
、hdfs-site.xml
、mapred-site.xml
和yarn-site.xml
。通过这些配置,实现了对集群内各节点的分工,如NameNode、ResourceManager以及DataNode和NodeManager等。
之后,文章介绍了Hadoop安装包的分发以及环境变量的配置,并说明了启动集群时需要进行的第一次格式化hdfs
操作。随后,提供了具体的启动步骤,并引导用户通过Java进程检查和Web管理页面验证集群是否正常运行。
最后,文章还对常见问题进行了分析,如NameNode未启动的故障处理,结合日志排查进行了详细的指导,为集群问题提供了解决思路。无论是搭建、管理还是故障排查,本篇文章都提供了完整的流程与实用性技巧,是一份极其重要的参考文档。
环境要求
需要有三台 Centos7 服务器,并都需要完成下面的配置要求:
- 关闭防火墙
- 新建普通用户
me
- 阿里云时钟同步服务器
- 配置免密登陆
- 关闭
selinux
- 配置
xsync
、xcall
同步脚本 - 配置
jdk8
环境 - 确保端口
8020,50090,50070,10020,19888,8088
端口没有被占用
环境准备可以参考我下面的博文:
集群规则
说明:
- 除特别说明外,本文的所有操作均在master节点、使用me这个非root用户执行
- 命令中出现的IP域名,均需要替换为自己集群中的IP域名【必须】
- 命令中出现的
/home/lbs/software
路径,可选择替换为自定义路径【可选】
服务器 IP域名 | master | node1 | node2 |
---|---|---|---|
HDFS | NameNode | ||
HDFS | SecondaryNameNode | ||
HDFS | DataNode | DataNode | DataNode |
YARN | ResourceManager | ||
YARN | NodeManager | NodeManager | NodeManager |
历史日志服务器 | JobHistoryServer |
安装集群
从百度云下载资源包
hadoop-2.6.0-cdh5.14.2_after_compile.tar.gz
,并上传到master
服务器1
https://pan.baidu.com/s/1nSUqi50p5u0skUAn4A-i-A?pwd=z8d7
解压
hadoop-2.6.0-cdh5.14.2_after_compile.tar.gz
到指定安装路径,并重命名目录为hadoop
1
2tar -zxvf hadoop-2.6.0-cdh5.14.2_after_compile.tar.gz -C /home/lbs/software
mv /home/lbs/software/hadoop-2.6.0-cdh5.14.2 /home/lbs/software/hadoop进入到
/home/lbs/software/hadoop
目录,执行下面命令检查环境配置是否符合要求1
2
3
4
5
6
7
8
9
10
11[me@master hadoop]$ ./bin/hadoop checknative
24/04/15 17:09:57 INFO bzip2.Bzip2Factory: Successfully loaded & initialized native-bzip2 library system-native
24/04/15 17:09:57 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library
Native library checking:
hadoop: true /home/lbs/software/hadoop/lib/native/libhadoop.so.1.0.0
zlib: true /lib64/libz.so.1
snappy: true /lib64/libsnappy.so.1
lz4: true revision:10301
bzip2: true /lib64/libbz2.so.1
openssl: true /lib64/libcrypto.so如果有
false
项,则需要使用yum
进行安装,直到全部为true
配置
hadoop-env.sh
文件1
2
3
4
5vim /home/lbs/software/hadoop/etc/hadoop/hadoop-env.sh
注释掉之前的内容,新增实际的jdk路径
export JAVA_HOME=${JAVA_HOME}
export JAVA_HOME=/app/jdk配置
core-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22echo '<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:8020</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/lbs/software/hadoop/hadoopDatas/tempDatas</value>
</property>
<!-- 缓冲区大小,实际工作中根据服务器性能动态调整 -->
<property>
<name>io.file.buffer.size</name>
<value>4096</value>
</property>
<!-- 开启hdfs的垃圾桶机制,删除掉的数据可以从垃圾桶中回收,单位分钟 -->
<property>
<name>fs.trash.interval</name>
<value>10080</value>
</property>
</configuration>' > /home/lbs/software/hadoop/etc/hadoop/core-site.xml配置
hdfs-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51echo '<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- NameNode存储元数据信息的路径,实际工作中,一般先确定磁盘的挂载目录,然后多个目录用,进行分割 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master:50090</value>
</property>
<property>
<name>dfs.namenode.http-address</name>
<value>master:50070</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///home/lbs/software/hadoop/hadoopDatas/namenodeDatas</value>
</property>
<!-- 定义dataNode数据存储的节点位置,实际工作中,一般先确定磁盘的挂载目录,然后多个目录用,进行分割 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///home/lbs/software/hadoop/hadoopDatas/datanodeDatas</value>
</property>
<property>
<name>dfs.namenode.edits.dir</name>
<value>file:///home/lbs/software/hadoop/hadoopDatas/dfs/nn/edits</value>
</property>
<property>
<name>dfs.namenode.checkpoint.dir</name>
<value>file:///home/lbs/software/hadoop/hadoopDatas/dfs/snn/name</value>
</property>
<property>
<name>dfs.namenode.checkpoint.edits.dir</name>
<value>file:///home/lbs/software/hadoop/hadoopDatas/dfs/nn/snn/edits</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
<property>
<name>dfs.blocksize</name>
<value>134217728</value>
</property>
<!--hdfs web端ui取消ip限制-->
<property>
<name>dfs.namenode.http-address</name>
<value>0.0.0.0:50070</value>
</property>
</configuration>' > /home/lbs/software/hadoop/etc/hadoop/hdfs-site.xml配置
mapred-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20echo '<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.job.ubertask.enable</name>
<value>true</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>master:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>0.0.0.0:19888</value>
</property>
</configuration>' > /home/lbs/software/hadoop/etc/hadoop/mapred-site.xml配置
yarn-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56<?xml version="1.0"?>
<configuration>
<!-- 节点管理器可用的 CPU 核心总数 -->
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>12</value>
</property>
<!-- 调度器可以分配给一个容器的最大 vcore 数 -->
<property>
<name>yarn.scheduler.maximum-allocation-vcores</name>
<value>4</value>
</property>
<!-- 调度器可以分配给一个容器的最小 vcore 数 -->
<property>
<name>yarn.scheduler.minimum-allocation-vcores</name>
<value>1</value>
</property>
<!-- 节点管理器可用的内存总量(MB) -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>34000</value>
</property>
<!-- 调度器可以分配给一个容器的最大内存量(MB) -->
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>34000</value>
</property>
<!-- 调度器可以分配给一个容器的最小内存量(MB) -->
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>1024</value>
</property>
<!-- 资源管理器的主机名 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>one</value>
</property>
<!-- 节点管理器的辅助服务(例如 MapReduce Shuffle) -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 资源管理器 Web 界面的访问地址 -->
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>0.0.0.0:8088</value>
</property>
</configuration>配置
slaves
1
2
3echo 'master
node1
node2' > /home/lbs/software/hadoop/etc/hadoop/slaves创建所需目录
1
2
3
4
5
6mkdir -p /home/lbs/software/hadoop/hadoopDatas/tempDatas
mkdir -p /home/lbs/software/hadoop/hadoopDatas/namenodeDatas
mkdir -p /home/lbs/software/hadoop/hadoopDatas/datanodeDatas
mkdir -p /home/lbs/software/hadoop/hadoopDatas/dfs/nn/edits
mkdir -p /home/lbs/software/hadoop/hadoopDatas/dfs/snn/name
mkdir -p /home/lbs/software/hadoop/hadoopDatas/dfs/nn/snn/edits分发
/home/lbs/software/hadoop
文件夹到集群中的其他两台机器1
xsync /home/lbs/software/hadoop
分别登录到集群中三台机器,都配置
hadoop
到环境变量中1
2
3
4
5
6
7sudo vim /etc/profile
Hadoop
export HADOOP_HOME=/home/lbs/software/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
最后重新加载环境变量
source /etc/profile
启动集群
首先格式化hdfs(仅第一次启动时需要!后续启动请勿重复执行)
1
hdfs namenode -format
依次启动
hdfs
、yarn
、historyserver
注意:下面的三条命令逐一执行,而不是一下全部执行
1
2
3start-dfs.sh
start-yarn.sh
mr-jobhistory-daemon.sh start historyserver
集群验证
首先验证各节点Java进程情况
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24[me@master bin]$ xcall jps
================current host is master=================
execute command "jps"
25985 JobHistoryServer
24419 DataNode
26261 Jps
24219 NameNode
25292 ResourceManager
25437 NodeManager
24750 SecondaryNameNode
Command executed successfully on master
================current host is node1=================
execute command "jps"
3545 DataNode
3690 NodeManager
3948 Jps
Command executed successfully on node1
================current host is node2=================
execute command "jps"
3609 DataNode
3754 NodeManager
4013 Jps
Command executed successfully on node2
All commands executed successfully!如果发现
namenode
进程没有出现,可以到文章最后查看解决方法查看
web
管理页面| 名称 | 地址 |
| — | — |
| hdfs | http://master:50070 |
| yarn | http://master:8088 |
| jobHistory | http://master:19888 |
关闭集群
关闭服务器之前最好提前手动关闭
hadoop
集群,防止出现集群异常的情况
1 | mr-jobhistory-daemon.sh stop historyserver |
问题解决
启动集群后发现namenode
进程没有启动,怎么办?
- 首先停止集群
1
2
3mr-jobhistory-daemon.sh stop historyserver
stop-yarn.sh
stop-dfs.sh - 清理配置在
core-site.xml
中<name>hadoop.tmp.dir</name>
配置项所指向的目录下的所有内容(不需要删除目录本身,只需要删除下面的内容即可) - 重新执行初始化
hdfs
的命令hadoop namenode -format
- 最后再次启动hadoop集群
1
2
3start-dfs.sh
start-yarn.sh
mr-jobhistory-daemon.sh start historyserver - 如果还是没有解决问题,需要进入到
hadoop
根目录的logs
目录下,查看hadoop-admin-namenode-master.log
日志。是否是端口被占用了,还是其他问题。
Hadoop集群搭建