本文档基于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 成功打印说明部署成功 image.png

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 成功打印说明部署成功 image.png

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查看进程是否启动 image.png 访问验证 访问namenode节点,默认端口9870 http://192.168.44.11:9870/ image.png 访问resourcemanager,默认端口8088 http://192.168.44.11:8088 image.png

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 如图: image.png 启动YARN start-yarn.sh 如图: image.png 还有一个管理所有节点的启动脚本 启动所有服务: start-all.sh 如图: image.png

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查看启动情况 image.png

然后查看历史任务网页端:历史任务主机IP+配置端口 http://192.168.44.11:19888/ 如图:启动正常 image.png

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: image.png 主机2: image.png 主机3: image.png 访问验证 访问namenode节点,主节点IP+默认端口9870 http://192.168.44.11:9870/ 可以看到,存在3个数据节点,说明集群启动正常 image.png 进一步查看,可以发现3节点IP一一对应。 image.png 访问resourcemanager,主节点IP+默认端口8088 http://192.168.44.12:8088 可以发现,活动节点也为3个,说明YARN集群也成功搭建。 image.png 进一步查看 3节点正常 image.png

3.1.11 批量启动Hadoop节点

3.1.11.1 分开启动HDFS与YARN

启动HDFS集群

注意:需要在namenode主节点执行批量脚本,否则无法启动

本教程HDFS集群主节点在主机1上,所以主机1执行 start-dfs.sh 如图: image.png 启动YARN集群

注意:需要在resourcemanager主节点执行批量脚本,否则无法启动

本教程YARN主节点在主机2上,所以主机2执行 start-yarn.sh 如图: image.png

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查看启动情况 image.png

然后查看历史任务网页端:历史任务主机IP+配置端口 http://192.168.44.11:19888/ 如图:启动正常 image.png

至此,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