本文档基于Centos系统进行操作 Hadoop是一个分布式的存储,但是当前工作中并没有使用到这个分布式存储,为了提高个人技术能力,最近研究了一下怎么部署Hadoop分布式集群。
1. 概述
Apache®Hadoop®项目为可靠的、可扩展的分布式计算开发开源软件。 Apache Hadoop软件库是一个框架,它允许使用简单的编程模型跨计算机集群对大型数据集进行分布式处理。 它被设计用于从单个服务器扩展到数千台机器,每台机器都提供本地计算和存储。该库本身不是依靠硬件来提供高可用性,而是设计用于检测和处理应用层的故障,从而在每台可能容易发生故障的计算机集群之上提供高可用性的服务。
2.环境准备
2.1 关闭防火墙和selinux
数据存储服务器通常运行在内部网络,因此可以关闭防火墙及selinux设置。
提醒: 虽然存储部署在内部网络,但也要时刻警惕数据泄漏的风险,做好必要的安全防护措施。
关闭防火墙服务
systemctl stop firewalld ; systemctl disable firewalld
关闭selinux
临时关闭
setenforce 0
永久关闭
sed -i '/^SELINUX=/c'SELINUX=disabled /etc/selinux/config
2.2 时间同步(可选)
集群模式下需要配置时间同步
本教程使用centos7自带的chronyd服务来进行时间同步。
服务端配置
选择一台节点(教程选择192.168.44.11)作为时间同步的服务端
修改配置文件:
vim /etc/chrony.conf
添加以下配置,允许时间同步
allow 192.168.44.0/24
local stratum 10
启动服务
systemctl start chronyd
配置开机自启
systemctl enable chronyd
查看服务状态
systemctl status chronyd.service
客户端配置
修改配置文件:
vim /etc/chrony.conf
修改时间同步服务为服务端
server 192.168.44.11 iburst
启动客户端服务
systemctl start chronyd
配置开机自启
systemctl enable chronyd
查看客户端服务状态
systemctl status chronyd.service
手动同步时间
chronyc -a makestep
查看时间同步情况:
chronyc sources -v
当显示为"^*"代表时间同步已完成
3. HADOOP部署方式
- 单机单节点模式 独立模式又称为单机模式,仅1个机器运行1个java进程,主要用于调试。
- 单机多节点模式(伪分布式模式) 伪分布模式是在1个机器上运行HDFS的集群模式,YARN的 ResourceManger和NodeManager,主要用于在机器不足,但又想体验Hadoop集群的情况,也主要是调试。
- 多机多节点模式(完全分布式模式) 集群模式主要用于生产环境部署。会使用N台主机组成一个Hadoop集群。这种部署模式下,主节点和从节点会分开部署在不同的机器上。
本教程仅介绍伪分布式模式及完全分布式模式
3.1 单机多节点部署(伪分布式部署)
3.1.1 部署规划
操作系统: Centos7.9 Hadoop版本: 3.4.0 伪分布式集群规划:
name | ip | role |
---|---|---|
hadoop-single | 192.168.44.11 | namenode<br>secondarynamenode<br>datanode<br>resourcemanager<br>nodemanager<br>historyserver(可选) |
3.1.2 部署JAVA环境
Hadoop3.4.0版本需要Java8的环境,因此需要下载Java8安装包
Hadoop版本与所需java环境对应请参考
Java下载地址
上传到服务器,并解压
tar -zxf jdk-8u281-linux-x64.tar.gz -C /usr/local
添加环境变量
vim /etc/profile
将以下内容添加到文件末尾
#JAVA_HOME
export JAVA_HOME=/usr/local/jdk1.8.0_281
export PATH=$PATH:$JAVA_HOME/bin
刷新环境变量
source /etc/profile
测试Java是否部署成功
java -version
成功打印说明部署成功
3.1.3 下载安装包
直接到官网下载打包好的二进制安装包
二进制安装包下载地址
截止本教程,官方最新版本为3.4.0版本,故选择下载3.4.0版本
上传到服务器,并解压
tar -zxf hadoop-3.4.0.tar.gz -C /usr/local
添加环境变量
vim /etc/profile
将以下内容添加到文件末尾
#HADOOP_HOME
export HADOOP_HOME=/usr/local/hadoop-3.4.0
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
刷新环境变量
source /etc/profile
测试Hadoop是否部署成功
hadoop version
成功打印说明部署成功
3.1.4 修改主机名及hosts文件
修改主机名
hostnamectl set-hostname hadoop-single
添加主机名IP映射
vim /etc/hosts
追加填入以下内容:
192.168.44.11 hadoop-single
注意:主机名不能包含‘.’ '/' '_'等非法字符。
3.1.5 修改配置文件
3.1.5.1 hadoop-env.sh
Hadoop运行时需要的环境变量。JAVA_HOME是必须设置的,因为Hadoop只读取该配置文件的环境变量来运行,并不会读取系统环境变量,所以必须配置。
cd /usr/local/hadoop-3.4.0/etc/hadoop
vim hadoop-env.sh
填入以下配置:
export JAVA_HOME=/usr/local/jdk1.8.0_281
3.1.5.2 core-site.xml
编辑核心配置文件core-site.xml
cd /usr/local/hadoop-3.4.0/etc/hadoop
vim core-site.xml
填入以下配置:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop-single:9000</value>
</property>
<!-- 指定Hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop-3.4.0/hadoopDatas/tmpDatas</value>
</property>
</configuration>
3.1.5.3 hdfs-site.xml
HDFS的核心配置文件,主要配置HDFS相关参数
cd /usr/local/hadoop-3.4.0/etc/hadoop
vim hdfs-site.xml
填入以下配置:
<configuration>
<!-- 文件切片的副本个数-->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<!-- 指定namenode元数据的存放位置 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///usr/local/hadoop-3.4.0/hadoopDatas/namenodeDatas</value>
</property>
<!-- 定义datanode数据存储的节点位置 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///usr/local/hadoop-3.4.0/hadoopDatas/datanodeDatas</value>
</property>
<!-- 定义namenode的edits文件存放路径 -->
<property>
<name>dfs.namenode.edits.dir</name>
<value>file:///usr/local/hadoop-3.4.0/hadoopDatas/nn/edits</value>
</property>
<!-- 配置检查点目录 -->
<property>
<name>dfs.namenode.checkpoint.dir</name>
<value>file:///usr/local/hadoop-3.4.0/hadoopDatas/snn/name</value>
</property>
<property>
<name>dfs.namenode.checkpoint.edits.dir</name>
<value>file:///usr/local/hadoop-3.4.0/hadoopDatas/dfs/snn/edits</value>
</property>
</configuration>
3.1.5.4 mapred-site.xml
MapReduce的核心配置文件
cd /usr/local/hadoop-3.4.0/etc/hadoop
vim mapred-site.xml
填入以下配置:
<configuration>
<!-- 指定分布式计算使用的框架是yarn -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
3.1.5.5 mapred-env.sh
在文件中指定JAVA_HOME环境变量。
cd /usr/local/hadoop-3.4.0/etc/hadoop
vim mapred-env.sh
填入以下配置:
export JAVA_HOME=/usr/local/jdk1.8.0_281
3.1.5.6 yarn-site.xml
YARN的核心配置文件
cd /usr/local/hadoop-3.4.0/etc/hadoop
vim yarn-site.xml
填入以下配置:
<configuration>
<!-- 指定YARN的ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop-single</value>
</property>
<!-- Reducer获取数据的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
3.1.5.7 yarn-env.sh
在文件中指定JAVA_HOME环境变量。
cd /usr/local/hadoop-3.4.0/etc/hadoop
vim yarn-env.sh
填入以下配置:
export JAVA_HOME=/usr/local/jdk1.8.0_281
3.1.6 创建数据存储目录
因为自定义了数据存储路径,所以需要先创建出来
mkdir -p /usr/local/hadoop-3.4.0/hadoopDatas/{tempDatas,namenodeDatas,datanodeDatas}
mkdir -p /usr/local/hadoop-3.4.0/hadoopDatas/nn/edits
mkdir -p /usr/local/hadoop-3.4.0/hadoopDatas/snn/name
mkdir -p /usr/local/hadoop-3.4.0/hadoopDatas/dfs/snn/edits
3.1.7 手动启动Hadoop节点
第一次启动需要格式化文件系统,后续就不需要了
若是需要重新格式化,注意删除上述创建数据存储路径下的文件,保证数据目录为空,同时还需删除logs目录下的日志文件
hdfs namenode -format
启动namenode节点
hdfs --daemon start namenode
启动secondarynamenode节点
hdfs --daemon start secondarynamenode
启动datanode节点
hdfs --daemon start datanode
启动resourcemanager节点
yarn --daemon start resourcemanager
启动nodemanager节点
yarn --daemon start nodemanager
启动完后,使用jps查看进程是否启动 访问验证 访问namenode节点,默认端口9870 http://192.168.44.11:9870/ 访问resourcemanager,默认端口8088 http://192.168.44.11:8088
3.1.8 批量启动Hadoop节点
手动启动需要一个个服务进行启动,相对比较麻烦,不过可以熟悉每个组件的启动及情况,若是熟悉后,可以使用hadoop自带的脚本进行快速启动。
3.1.8.1 配置免密
即使是单机部署分布式,要使用脚本批量启动,也是需要配置免密登录的
生成密钥
ssh-keygen
一直回车即可
配置免密
ssh-copy-id root@192.168.44.11
若是没有ssh-copy-id,可以使用yum进行安装
yum -y install sshpass
或者手动将用户目录下.ssh/id_rsa.pub公钥内容复制到需要配置免密机器的用户目录.ssh/authorized_keys文件中即可
3.1.8.2 配置环境变量
HDFS启动脚本需要配置各个节点的使用用户,这里我们为了方便使用了root,因此要指定root用户
cd /usr/local/hadoop-3.4.0/etc/hadoop
vim hadoop-env.sh
将以下内容填入:
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
YARN启动脚本同理
cd /usr/local/hadoop-3.4.0/etc/hadoop
vim yarn-env.sh
填入以下配置:
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
3.1.8.3 启动
现在,就可以使用脚本进行快速启动了
启动HDFS
start-dfs.sh
如图:
启动YARN
start-yarn.sh
如图:
还有一个管理所有节点的启动脚本
启动所有服务:
start-all.sh
如图:
3.1.9 启动历史任务服务(可选)
编辑配置文件:
cd /usr/local/hadoop-3.4.0/etc/hadoop
vim mapred-site.xml
追加以下配置:
<!-- 设置历史任务的主机和端口 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop-single:10020</value>
</property>
<!-- 设置网页访问历史任务的主机和端口 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop-single:19888</value>
</property>
然后启动历史任务服务
mapred --daemon start historyserver
使用jps查看启动情况
然后查看历史任务网页端:历史任务主机IP+配置端口 http://192.168.44.11:19888/ 如图:启动正常
3.2 多机多节点部署(完全分布式部署)
3.1.1 部署规划
操作系统: Centos7.9 Hadoop版本: 3.4.0 完全分布式集群规划:
name | ip | role |
---|---|---|
hadoop-node1 | 192.168.44.11 | namenode<br>datanode<br>nodemanager<br>historyserver(可选) |
hadoop-node2 | 192.168.44.12 | datanode<br>resourcemanager<br>nodemanager |
hadoop-node3 | 192.168.44.13 | secondarynamenode<br>datanode<br>nodemanager |
3.1.2 部署JAVA环境
请参考章节3.1.2 在主机1部署即可,后续通过文件分发,将java文件复制到其他节点 但其他节点需要配置JAVA_HOME环境变量
主机2、3执行下面操作 添加环境变量
vim /etc/profile
将以下内容添加到文件末尾
#JAVA_HOME
export JAVA_HOME=/usr/local/jdk1.8.0_281
export PATH=$PATH:$JAVA_HOME/bin
刷新环境变量
source /etc/profile
3.1.3 下载安装包
请参考章节3.1.3 在主机1部署即可,后续通过文件分发,将hadoop文件复制到其他节点 但其他节点需要配置HADOOP_HOME环境变量
主机2、3执行下面操作 添加环境变量
vim /etc/profile
将以下内容添加到文件末尾
#HADOOP_HOME
export HADOOP_HOME=/usr/local/hadoop-3.4.0
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
刷新环境变量
source /etc/profile
3.1.4 配置时间同步
请参考章节2.2
3.1.5 修改主机名及hosts文件
主机1修改主机名:
hostnamectl set-hostname hadoop-node1
主机2修改主机名:
hostnamectl set-hostname hadoop-node2
主机3修改主机名:
hostnamectl set-hostname hadoop-node3
3台主机都需要执行下面操作:
添加主机名IP映射
vim /etc/hosts
追加填入以下内容:
192.168.44.11 hadoop-node1
192.168.44.12 hadoop-node2
192.168.44.13 hadoop-node3
注意:主机名不能包含‘.’ '/' '_'等非法字符。
3.1.6 配置免密
因为HDFS集群的主节点在主机1,YARN集群的主节点在主机2
所以主机1、2需要配置免密登录其他所有节点
生成密钥
ssh-keygen
一直回车即可
配置免密(若是已配置的可忽略)
ssh-copy-id root@192.168.44.11
ssh-copy-id root@192.168.44.12
ssh-copy-id root@192.168.44.13
若是没有ssh-copy-id,可以使用yum进行安装
yum -y install sshpass
或者手动将用户目录下.ssh/id_rsa.pub公钥内容复制到需要配置免密机器的用户目录.ssh/authorized_keys文件中即可
3.1.7 修改配置文件
在主机1执行
3.2.7.1 hadoop-env.sh
Hadoop运行时需要的环境变量。JAVA_HOME是必须设置的,因为Hadoop只读取该配置文件的环境变量来运行,并不会读取系统环境变量,所以必须配置。
cd /usr/local/hadoop-3.4.0/etc/hadoop
vim hadoop-env.sh
填入以下配置:
export JAVA_HOME=/usr/local/jdk1.8.0_281
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
3.2.7.2 core-site.xml
编辑核心配置文件core-site.xml
cd /usr/local/hadoop-3.4.0/etc/hadoop
vim core-site.xml
填入以下配置:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop-node1:9000</value>
</property>
<!-- 指定Hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop-3.4.0/hadoopDatas/tmpDatas</value>
</property>
</configuration>
3.2.7.3 hdfs-site.xml
HDFS的核心配置文件,主要配置HDFS相关参数
cd /usr/local/hadoop-3.4.0/etc/hadoop
vim hdfs-site.xml
填入以下配置:
<configuration>
<!-- 指定namenode的页面访问地址和端口 -->
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop-node1:9870</value>
</property>
<!-- 指定SecondaryNameNode的主机和端口 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop-node3:9870</value>
</property>
<!-- 文件切片的副本个数-->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 指定namenode元数据的存放位置 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///usr/local/hadoop-3.4.0/hadoopDatas/namenodeDatas</value>
</property>
<!-- 定义datanode数据存储的节点位置 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///usr/local/hadoop-3.4.0/hadoopDatas/datanodeDatas</value>
</property>
<!-- 定义namenode的edits文件存放路径 -->
<property>
<name>dfs.namenode.edits.dir</name>
<value>file:///usr/local/hadoop-3.4.0/hadoopDatas/nn/edits</value>
</property>
<!-- 配置检查点目录 -->
<property>
<name>dfs.namenode.checkpoint.dir</name>
<value>file:///usr/local/hadoop-3.4.0/hadoopDatas/snn/name</value>
</property>
<property>
<name>dfs.namenode.checkpoint.edits.dir</name>
<value>file:///usr/local/hadoop-3.4.0/hadoopDatas/dfs/snn/edits</value>
</property>
</configuration>
3.2.7.4 mapred-site.xml
MapReduce的核心配置文件
cd /usr/local/hadoop-3.4.0/etc/hadoop
vim mapred-site.xml
填入以下配置:
<configuration>
<!-- 指定分布式计算使用的框架是yarn -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
3.2.7.5 mapred-env.sh
在文件中指定JAVA_HOME环境变量。
cd /usr/local/hadoop-3.4.0/etc/hadoop
vim mapred-env.sh
填入以下配置:
export JAVA_HOME=/usr/local/jdk1.8.0_281
3.2.7.6 yarn-site.xml
YARN的核心配置文件
cd /usr/local/hadoop-3.4.0/etc/hadoop
vim yarn-site.xml
填入以下配置:
<configuration>
<!-- 指定YARN的ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop-node2</value>
</property>
<!-- Reducer获取数据的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
3.2.7.7 yarn-env.sh
在文件中指定JAVA_HOME环境变量。
cd /usr/local/hadoop-3.4.0/etc/hadoop
vim yarn-env.sh
填入以下配置:
export JAVA_HOME=/usr/local/jdk1.8.0_281
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
3.2.7.8 workers
workers文件里面记录的是集群主机名,一行一个,主要是用于配合一键启动脚本使用
cd /usr/local/hadoop-3.4.0/etc/hadoop
vim workers
填入以下配置:
hadoop-node1
hadoop-node2
hadoop-node3
3.1.8 创建数据存储目录
因为自定义了数据存储路径,所以需要先创建出来
mkdir -p /usr/local/hadoop-3.4.0/hadoopDatas/{tempDatas,namenodeDatas,datanodeDatas}
mkdir -p /usr/local/hadoop-3.4.0/hadoopDatas/nn/edits
mkdir -p /usr/local/hadoop-3.4.0/hadoopDatas/snn/name
mkdir -p /usr/local/hadoop-3.4.0/hadoopDatas/dfs/snn/edits
3.1.9 分发文件到其他节点
复制到主机2:
scp -r /usr/local/jdk1.8.0_281 root@192.168.44.12:/usr/local
scp -r /usr/local/hadoop-3.4.0 root@192.168.44.12:/usr/local
复制到主机3:
scp -r /usr/local/jdk1.8.0_281 root@192.168.44.13:/usr/local
scp -r /usr/local/hadoop-3.4.0 root@192.168.44.13:/usr/local
3.1.10 手动启动Hadoop节点
第一次启动需要格式化文件系统,后续就不需要了
若是需要重新格式化,注意删除上述创建数据存储路径下的文件,保证数据目录为空,同时还需删除logs目录下的日志文件
因为namenode主节点在主机1上,所以主机1执行:
hdfs namenode -format
然后启动namenode节点
hdfs --daemon start namenode
secondarynamenode节点在主机3上,因此
到主机3上启动secondarynamenode节点
hdfs --daemon start secondarynamenode
datanode节点在所有主机上都存在,要在所有主机启动:
启动datanode节点
hdfs --daemon start datanode
resourcemanager主节点在主机2上,所以主机2执行:
启动resourcemanager节点
yarn --daemon start resourcemanager
nodemanager节点在所有主机上都存在,要在所有主机启动:
启动nodemanager节点
yarn --daemon start nodemanager
启动完后,使用jps查看进程是否启动 主机1: 主机2: 主机3: 访问验证 访问namenode节点,主节点IP+默认端口9870 http://192.168.44.11:9870/ 可以看到,存在3个数据节点,说明集群启动正常 进一步查看,可以发现3节点IP一一对应。 访问resourcemanager,主节点IP+默认端口8088 http://192.168.44.12:8088 可以发现,活动节点也为3个,说明YARN集群也成功搭建。 进一步查看 3节点正常
3.1.11 批量启动Hadoop节点
3.1.11.1 分开启动HDFS与YARN
启动HDFS集群
注意:需要在namenode主节点执行批量脚本,否则无法启动
本教程HDFS集群主节点在主机1上,所以主机1执行
start-dfs.sh
如图:
启动YARN集群
注意:需要在resourcemanager主节点执行批量脚本,否则无法启动
本教程YARN主节点在主机2上,所以主机2执行
start-yarn.sh
如图:
3.1.11.2 同时启动HDFS与YARN
同时启动脚本,要求namenode主节点与resourcemanager主节点放在一起!!!
这样就可以在主节点上执行执行:
start-all.sh
该脚本可以同时启动HDFS集群和YARN集群,而无需分开启动HDFS集群和YARN集群了
3.1.12 启动历史任务服务(可选)
编辑配置文件:
cd /usr/local/hadoop-3.4.0/etc/hadoop
vim mapred-site.xml
追加以下配置:
<!-- 设置历史任务的主机和端口 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop-single:10020</value>
</property>
<!-- 设置网页访问历史任务的主机和端口 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop-single:19888</value>
</property>
然后启动历史任务服务
mapred --daemon start historyserver
使用jps查看启动情况
然后查看历史任务网页端:历史任务主机IP+配置端口 http://192.168.44.11:19888/ 如图:启动正常
至此,Hadoop集群部署到此结束
需要注意的是:
- 这里的Hadoop完全分布式集群严格意义上并不能说是完全分布式集群,因为YARN集群的resourcemanager节点只有一个主节点,一旦主节点故障,则YARN集群无法使用,要搭建YARN集群,还需搭配zookeeper集群才能搭建resourcemanager HA高可用,这一块由于时间文档,后续再补充到本教程
- 时间较短,写得稍微匆忙,若有不正确的地方,请多多见谅,欢迎留言交流指正,谢谢!
参考文掌:
- https://hadoop.apache.org/docs/r3.4.0/hadoop-project-dist/hadoop-common/ClusterSetup.html
- https://cloud.tencent.com/developer/article/1887123
- https://blog.csdn.net/tang5615/article/details/120382513
- https://blog.csdn.net/weixin_42837961/article/details/105493561