Hadoop3的高可用搭建

1. 准备工作
前期准备工作包括了

 CenOS 7虚拟化安装与配置,

Java虚拟机的安装, 

Hadoop相关部署包的下载,

Hadoop集群所需基础环境的配置。

第一点CenOS 7虚拟化安装与配置和第二点Java虚拟机的安装:

需要我们参考第一章:大数据技术训练舱——从零开始安装、配置CentOS 7

第三点Hadoop相关部署包的下载:

这就包括了ZooKeeper部署包、Hadoop部署包。ZooKeeper是分布式协调系统,主要用于Hadoop的高可用(HA)协调;

Hadoop部署包括了HDFS(Hadoop分布式文件系统)和YARN(Hadoop资源管理者)。

ZooKeeper最新版3.7下载地址

Hadoop最新版本3.3.1下载地址

第四点Hadoop集群所需基础环境的配置,包括:

1) 复制节点构建集群

2) 集群节点间ssh免密登陆

我们本次集群实践至少需要三个CentOS节点,我们有两种办法实现,第一种办法就是按照中的安装步骤连续安装三个节点;

第二种办法比较简单,需要将第一次安装后的CentOS虚拟化文件再复制两份,然后进行二次修改。

1) 复制节点构建集群
  步骤:

(1) MacOS的VMware Fusion会生成一份虚拟机文件,如下图2.1所示,我将“CentOS 7 64 位”文件又复制了两份。Windows的VMware Workstaion则会将很多虚拟机文件放在一个目录里,因此我们需要再复制两份目录。

图2.1

(2) 我们需要对复制过的文件进行IP和主机名修改,MacOS的VMware Fusion直接打开复制后的文件,Windows的VMware Workstaion则打开复制后目录里的.vmx文件。需要注意一点:修改IP之前尽量关闭第一个节点。

我们打开后,VMware会提示“复制”或“移动”,请选择复制。

(3) 系统启动后,通过与第一个节点相同设定root用户名和密码登陆,我们首先修改IP,参考大数据技术训练舱——从零开始安装、配置CentOS 7中第3部分的网络配置,修改ifcfg-ens33配置文件,将新的两个节点的IP从192.168.83.4修改为192.168.83.5和192.168.83.6,

#新增的两个节点修改此IP为192.168.83.5或192.168.83.6
 
IPADDR=192.168.83.4
 (4) 然后我们进行主机名的修改,在192.168.83.5节点上执行:

hostnamectl set-hostname datanode-2
在192.168.83.6节点上执行:

hostnamectl set-hostname datanode-3
各个节点重启后,我们将形成主机/IP的映射关系如下:

192.168.83.4 datanode-1
192.168.83.5 datanode-2
192.168.83.6 datanode-3
(5) 请将上面这三条IP/主机名映射关系记录分别追加到这三个节点的/etc/hosts文件里:

vim /etc/hosts
如下图2.2所示:

图2.2

2) 集群节点间ssh免密登陆
Hadoop集群具有远程节点控制的需要,因此集群节点之间需要设置为ssh免密登录模式。

步骤:

(1) 通过ssh分别登陆datanode-1、datanode-2、datanode-3,若/root/.ssh目录不存在,创建此目录并修改目录权限属性。

mkdir /root/.ssh
chmod -R 0600 /root/.ssh
(2) 登陆datanode-1节点制作公私密钥。生成ssh登陆公私密钥id_rsa、id_rsa.pub,追加authorized_keys,修改目录内的文件权限属性。

ssh-keygen -t rsa -P '' -f /root/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
chmod 0600 /root/.ssh/id_rsa
chmod 0600 /root/.ssh/authorized_keys
(3) 复制id_rsa、authorized_keys到其他节点。

scp /root/.ssh/authorized_keys root@datanode-2:/root/.ssh/
scp /root/.ssh/id_rsa root@datanode-2:/root/.ssh/
scp /root/.ssh/authorized_keys root@datanode-3:/root/.ssh/
scp /root/.ssh/id_rsa root@datanode-3:/root/.ssh/
做到这一步,我们准备工作已经完成,我们可以在这三个节点上用ssh datanode-(序号)的命令执行测试,看看互相之间ssh登陆是否已经不需要密码了。  注意只要/root/.ssh目录及下面的密钥没有实现0600权限属性,就无法实现免密登陆。

2. ZooKeeper集群部署
ZooKeeper是Hadoop高可用环境的分布式协调系统,因此我们搭建Hadoop HA集群之前一定先部署ZooKeeper集群。

 1) 上传解压
首先我们需要将下载到本机的ZooKeeper部署包上传至这三个节点,Mac系统如下:

scp /Users/你的用户名/Downloads/apache-zookeeper-3.7.0-bin.tar.gz [email protected]:/root
scp /Users/你的用户名/Downloads/apache-zookeeper-3.7.0-bin.tar.gz [email protected]:/root
scp /Users/你的用户名/Downloads/apache-zookeeper-3.7.0-bin.tar.gz [email protected]:/root
Windows平台请参考大数据技术训练舱——从零开始安装、配置CentOS 7中Java环境安装的jdk包上传。

我们选择了这三个节点同时为ZooKeeper的集群节点,分别ssh登陆datanode-1、datanode-2、datanode-3,解压到/opt目录,并做好软链,三节点分别执行:

 tar -zxvf /root/apache-zookeeper-3.7.0-bin.tar.gz -C /opt/
 ln -s /opt/apache-zookeeper-3.7.0-bin /opt/zookeeper
2) 环境配置
登陆datanode-1节点编辑/etc/profile:

 vim /etc/profile
追加 ZooKeeper bin目录到PATH,实现ZK命令全局可执行:

export ZOOKEEPER_HOME=/opt/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin
并使其执行生效:

source /etc/profile
Profile文件复制给其他两个节点:

scp /etc/profile root@datanode-2:/etc
scp /etc/profile root@datanode-3:/etc
生成ZooKeeper配置文件,并编辑:

cp /opt/zookeeper/conf/zoo_sample.cfg /opt/zookeeper/conf/zoo.cfg
vim /opt/zookeeper/conf/zoo.cfg
配置zoo.cfg,ZK数据放在在/home/data/zkdata下,端口为2888,3888

dataDir=/home/data/zkdata
server.1=datanode-1:2888:3888
server.2=datanode-2:2888:3888
server.3=datanode-3:2888:3888
如下图2.3蓝框所示:

图2.3

 分发zoo.cfg到其他节点:

scp /opt/zookeeper/conf/zoo.cfg root@datanode-2:/opt/zookeeper/conf
scp /opt/zookeeper/conf/zoo.cfg root@datanode-3:/opt/zookeeper/conf
创建数据目录和集群标识:

mkdir -p /home/data/zkdata
echo "1" > /home/data/zkdata/myid
登陆datanode-2,执行上面操作,但集群标识为2

mkdir -p /home/data/zkdata
echo "2" > /home/data/zkdata/myid
登陆datanode-3,执行上面操作,但集群标识为3

mkdir -p /home/data/zkdata
echo "3" > /home/data/zkdata/myid
分别登陆三个节点,启动zookeeper:

zkServer.sh start
3).测试
每台机器jps查看验证zk进程:

jps

任意节点登陆ZK客户端,验证zk客户端,获取配置路径ZNode信息,并退出:

zkCli.sh
get /zookeeper/config
quit
蓝色框所示:

我们也可以分别三个节点验证当前ZK节点属于Leader还是Follower,注:ZK集群只有一个Leader:

zkServer.sh status
datanode-3节点为ZK集群的Leader节点:

 4).加入自启动
登陆datanode-1节点增加并编辑systemctl自启动文件:

vim /etc/systemd/system/zookeeper.service
编辑内容:

[Unit]
Description=zookeeper.service
After=network.target
ConditionPathExists=/opt/zookeeper/conf/zoo.cfg
[Service]
Type=forking
Environment=JAVA_HOME=/usr/jdk1.8.0_311
User=root
Group=root
ExecStart=/opt/zookeeper/bin/zkServer.sh start
ExecStop=/opt/zookeeper/bin/zkServer.sh stop
[Install]
WantedBy=multi-user.target
分发到其他节点:

scp /etc/systemd/system/zookeeper.service root@datanode-2:/etc/systemd/system
scp /etc/systemd/system/zookeeper.service root@datanode-3:/etc/systemd/system
分别ssh登陆datanode-1、datanode-2、datanode-3,增加到系统自启动服务,并kill掉ZK进程,该用systemctl启动验证:

systemctl enable zookeeper
jps |grep QuorumPeerMain|awk '{print $1}'|xargs kill -9
systemctl start zookeeper
jps
3. HDFS高可用集群部署
HDFS(Hadoop分布式文件系统)是Hadoop生态的数据底座,很多上层大数据技术框架最终会依赖对HDFS的读与写,HDFS是Hadoop部署的关键部分。HDFS为集中式元数据管理,其中主服务NameNode部署可以分为单机版和高可用版(HA)两种,作为以高可靠为目的的大数据存储系统,高可用性非常关键,因此作为训练目的,我们应该掌握高可用版的部署,同样我们也要面对高可用的部署复杂度。

1) 上传解压 
首先我们需要将下载到本机的Hadoop部署包上传至这三个节点,Mac系统如下:

scp /Users/你的用户名/Downloads/hadoop-3.3.1.tar.gz [email protected]:/root
scp /Users/你的用户名/Downloads/hadoop-3.3.1.tar.gz [email protected]:/root
scp /Users/你的用户名/Downloads/hadoop-3.3.1.tar.gz [email protected]:/root
我们选择了这三个节点为HDFS的集群节点,通过ssh分别登陆datanode-1、datanode-2、datanode-3,解压到/opt目录,并做好软链,三节点分别执行:

tar -zxvf hadoop-3.3.1.tar.gz -C /opt
ln -s /opt/hadoop-3.3.1 /opt/hadoop
2) 环境配置
登陆datanode-1节点编辑/etc/profile:

 vim /etc/profile
追加 Haddop bin目录到PATH,实现Hadoop命令全局可执行:

export HADOOP_HOME=/opt/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
并使其执行生效:

source /etc/profile
将profile分发到其他节点:

scp /etc/profile root@datanode-2:/etc
scp /etc/profile root@datanode-3:/etc
编辑hadoop环境变量

vim /opt/hadoop/etc/hadoop/hadoop-env.sh
  vi非编辑模式,查询关键字“export JAVA_HOME”,输入下面关键字、回车、查询:

/export JAVA_HOME
查询到"#export JAVA_HOME=",vi进入编辑模式取消注释,修改为:

export JAVA_HOME=/usr/jdk1.8.0_311
 vi非编辑模式,查询关键字“export HADOOP_HOME”,输入下面关键字、回车、查询:

/export HADOOP_HOME
查询到“#export HADOOP_HOME=”,vi进入编辑模式取消注释,修改为:

export HADOOP_HOME=/opt/hadoop
编辑HDFS参数配置文件:

vim /opt/hadoop/etc/hadoop/hdfs-site.xml
之间增加如下内容:


    
    dfs.nameservices
    fsnss
  
  
    
    dfs.permissions.enabled
    false
  
  
    
    dfs.ha.namenodes.fsnss
    nn1,nn2
  
  
    
    dfs.namenode.rpc-address.fsnss.nn1
    datanode-1:9820
  
  
    
    dfs.namenode.rpc-address.fsnss.nn2
    datanode-2:9820
  
  
    
    dfs.namenode.http-address.fsnss.nn1
    datanode-1:9870
  
  
    
    dfs.namenode.http-address.fsnss.nn2
    datanode-2:9870
  
  
    
    dfs.namenode.shared.edits.dir
    qjournal://datanode-1:8485;datanode-2:8485;datanode-3:8485/fsnss
  
  
    
    dfs.client.failover.proxy.provider.fsnss
    org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
  
  
    
    dfs.ha.fencing.methods
    sshfence
  
  
    
    dfs.ha.fencing.ssh.private-key-files
    /root/.ssh/id_rsa
  
  
    
    dfs.journalnode.edits.dir
    /home/data/dfs/journal/node/local/data
  
  
    
    dfs.ha.automatic-failover.enabled
    true
    

编辑core-site.xml

vim /opt/hadoop/etc/hadoop/core-site.xml
之间增加如下内容:

  
     
    fs.defaultFS
    hdfs://fsnss
  
  
  
    hadoop.tmp.dir
    /home/data/dfs/hadoop/
  
  
    
    ha.zookeeper.quorum
    datanode-1:2181,datanode-2:2181,datanode-3:2181
  

4. YARN高可用集群配置
YARN是Hadoop资源管理和和作业调度的核心组件,是MapReduce V2框架的主要组成部分。

按照高可用计算架构部署,datanode-1、datnode-2两个节点组成ResourceManager(RM) HA,负责整个集群的资源管理和调度。

编辑yarn-site.xml

vim /opt/hadoop/etc/hadoop/yarn-site.xml
之间增加如下内容:


    
    yarn.nodemanager.aux-services
    mapreduce_shuffle
  
  
    
    yarn.nodemanager.env-whitelist
    JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME
    
  
     
    yarn.resourcemanager.ha.enabled
    true
    
  
    
    yarn.resourcemanager.cluster-id
    mycls
  
  
    
    yarn.resourcemanager.ha.rm-ids
    rm1,rm2
  
  
    
    yarn.resourcemanager.hostname.rm1
    datanode-1
  
  
    
    yarn.resourcemanager.hostname.rm2
    datanode-2
  
  
    
    yarn.resourcemanager.webapp.address.rm1
    datanode-1:8088
  
  
    
    yarn.resourcemanager.webapp.address.rm2
    datanode-2:8088
  
  
    
    yarn.resourcemanager.zk-address
    datanode-1:2181,datanode-2:2181,datanode-3:2181
    
  
    
    yarn.nodemanager.resource.detect-hardware-capabilities
    true
  
  
  
    yarn.log-aggregation-enable
    true
  
  
  
    yarn.nodemanager.remote-app-log-dir
    /user/container/logs
  
  
   
    mapreduce.map.memory.mb
    1536
  


编辑mapred-site.xml:

vim /opt/hadoop/etc/hadoop/mapred-site.xml
之间增加如下内容:

 


   
    mapreduce.framework.name
    yarn
  
  
  
    mapreduce.jobhistory.address
    datanode-1:10020
  
  
    
    mapreduce.jobhistory.webapp.address
    datanode-1:19888
  
  
    
    mapreduce.jobhistory.intermediate-done-dir
    /mr-history/tmp
  
  
   
    mapreduce.jobhistory.done-dir
    /mr-history/done
  

5. 结束配置与初始化
 1) 配置文件分发

scp /opt/hadoop/etc/hadoop/hadoop-env.sh root@datanode-2:/opt/hadoop/etc/hadoop
scp /opt/hadoop/etc/hadoop/hadoop-env.sh root@datanode-3:/opt/hadoop/etc/hadoop
scp /opt/hadoop/etc/hadoop/hdfs-site.xml root@datanode-2:/opt/hadoop/etc/hadoop
scp /opt/hadoop/etc/hadoop/hdfs-site.xml root@datanode-3:/opt/hadoop/etc/hadoop
scp /opt/hadoop/etc/hadoop/core-site.xml root@datanode-2:/opt/hadoop/etc/hadoop
scp /opt/hadoop/etc/hadoop/core-site.xml root@datanode-3:/opt/hadoop/etc/hadoop
scp /opt/hadoop/etc/hadoop/yarn-site.xml root@datanode-2:/opt/hadoop/etc/hadoop
scp /opt/hadoop/etc/hadoop/yarn-site.xml root@datanode-3:/opt/hadoop/etc/hadoop
scp /opt/hadoop/etc/hadoop/mapred-site.xml root@datanode-2:/opt/hadoop/etc/hadoop
scp /opt/hadoop/etc/hadoop/mapred-site.xml root@datanode-3:/opt/hadoop/etc/hadoop


2) 初始化
(1) 登陆datanode-1,连接ZooKeeper,格式化ZKFC(ZK故障转移控制):

hdfs zkfc -formatZK
日志打印中的蓝色框代表初始化成功。

登陆ZooKeeper,检查hadoop-ha节点是否创建:

zkCli.sh
ls /hadoop-ha
quit
ZooKeeper中创建的ZNode节点/hadoop-ha/fsnss

通过ssh分别登陆datanode-1、datanode-2、datanode-3,启动journalnode:

hdfs --daemon start journalnode
通过jps命令,查看journalnode节点进程是否启动正常

重返datanode-1节点,格式化namenode nn1:

 hdfs namenode -format nn1
代表格式化成功:

启动namenode nn1,准备namenode nn2格式化同步:

hdfs --daemon start namenode
通过jps命令,查看namenode节点进程是否启动正常,如下图2.10所示:

登陆datanode-2节点,执行namenode nn2格式化同步:

hdfs namenode -bootstrapStandby
代表格式化同步成功:

启动namenode nn2,组成高可用:

hdfs --daemon start namenode
通过jps命令,查看namenode节点进程是否启动正常:

我们查看一下高可用的状态:

hdfs haadmin -getAllServiceState
这时候,我们得到的是nn1、nn2都属于准备状态:

datanode-1:9820                                    standby   
datanode-2:9820                                    standby 
我们将namenode nn1变为激活状态成为主服务:

hdfs haadmin -transitionToActive --forcemanual nn1
执行过程选择‘Y’,然后再查看一下高可用状态,我们会发现nn1已经变为active状态。

我们打开客户端浏览器,输入nn1的地址(谁处于Active状态就输入谁的IP地址):

http://192.168.83.4:9870
就能看到HDFS管理界面,只不过这时候还没有任何DataNode节点:

重返datanode-1节点,编辑works列表:

vim /opt/hadoop/etc/hadoop/workers
删除localhost,增加这三个节点为DataNode节点:

datanode-1
datanode-2
datanode-3
编辑start-dfs.sh、stop-dfs.sh:

vim /opt/hadoop/sbin/start-dfs.sh
vim /opt/hadoop/sbin/stop-dfs.sh
在第一行之后处加入root和Hadoop用户的绑定:

HDFS_DATANODE_USER=root
HDFS_DATANODE_SECURE_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
HDFS_JOURNALNODE_USER=root
HDFS_ZKFC_USER=root

编辑start-yarn.sh、stop-yarn.sh:

vim /opt/hadoop/sbin/start-yarn.sh
vim /opt/hadoop/sbin/stop-yarn.sh
在第一行之后处加入root和Hadoop用户的绑定:

YARN_RESOURCEMANAGER_USER=root
HADOOP_USER_NAME=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=roo

配置文件分发:

scp /opt/hadoop/etc/hadoop/workers root@datanode-2:/opt/hadoop/etc/hadoop
scp /opt/hadoop/etc/hadoop/workers root@datanode-3:/opt/hadoop/etc/hadoop
scp /opt/hadoop/sbin/start-dfs.sh root@datanode-2:/opt/hadoop/sbin
scp /opt/hadoop/sbin/start-dfs.sh root@datanode-3:/opt/hadoop/sbin
scp /opt/hadoop/sbin/stop-dfs.sh root@datanode-2:/opt/hadoop/sbin
scp /opt/hadoop/sbin/stop-dfs.sh root@datanode-3:/opt/hadoop/sbin
scp /opt/hadoop/sbin/start-yarn.sh root@datanode-2:/opt/hadoop/sbin
scp /opt/hadoop/sbin/start-yarn.sh root@datanode-3:/opt/hadoop/sbin
scp /opt/hadoop/sbin/stop-yarn.sh root@datanode-2:/opt/hadoop/sbin
scp /opt/hadoop/sbin/stop-yarn.sh root@datanode-3:/opt/hadoop/sbin


通过ssh分别登陆datanode-1、datanode-2、datanode-3,jps命令显示的Java进程中,除了保留ZooKeeper进程之外,其他全部Kill:

jps |grep -v 'QuorumPeerMain\|Jps'|awk '{print $1}'|xargs kill -9
6. 启动与验证
 1) 启动HDFS
登陆datanode-1节点,执行HDFS集群启动:

 start-dfs.sh
NameNode高可用[datanode-1、datanode-2],Journal集群[datanode-1、datanode-2、datanode-3],ZKFC服务[datanode-1、datanode-2]全部正常启动。

我们分别登陆三个节点,用jps验证包括DataNode进程是否正常启动

HDFS进程列表:

datanode-1    NameNode、DFSZKFailoverController、QuorumPeerMain、DataNode、JournalNode
datanode-2    NameNode、DFSZKFailoverController、QuorumPeerMain、DataNode、JournalNode
datanode-3    QuorumPeerMain、DataNode、JournalNode
2) 启动YARN
重返datanode-1节点,执行YARN集群启动:

start-yarn.sh 
ResourceManager高可用[datanode-1、datanode-2],各个节点NodeManager正常启动:

我们分别登陆三个节点,用jps验证

启动工作任务记录服务:

mapred --daemon start historyserver
在datanode-1节点启动了JobHistoryServer进程,

至此,Hadoop安装已经结束。

 3) 验证HDFS
我们做一个简单的HDFS验证:

hdfs dfs -mkdir /sdk
hdfs dfs -put jdk-8u311-linux-x64.tar.gz /sdk
hdfs dfs -ls /sdk
我们为HDFS根目录创建了sdk子目录,并上传JDK包,查看sdk目录,

我们再看看HDFS界面管理端,sdk上传的目录:

DFS管理端监控的三个数据节点[datanode-1、datanode-2、datanode-3]。

3) 验证YARN
我们编写一个MapReduce样例程序来验证Yarn系统是否正常。

我们的目标是:将一组三份存有数字的乱序文件通过MapRedue程序排序计数后输出,特点是三个Map任务的输出经过混洗排序后,通过自定义分区划分的范围,分别交给三个Reduce进行计数,并输出给三个排序过的文件。

分区划分:小于数字500一组、大于等于500并小于1000一组,大于等于1000一组。

三份乱序文件

MapReduce排序后的三份计数后的文件。

我们先将三份乱序文件上传到HDFS:

hdfs dfs -put file* /example/simple1/sort/input
hdfs dfs -ls /example/simple1/sort/input

我们执行打包好的MR测试程序:

hadoop jar HadoopTrainer-1.0-SNAPSHOT.jar 
,展示了MR整个执行日志输出过程,红色箭头指向的任务为:

job: job_1640683809954_0003,我们可以在Yarn管理端查看此任务日志。

可以看到Map任务为3个,Reduce任务为3个。

客户端打开Yarn管理端需要将IP和节点名加入到host里面,Mac系统:

sudo vi /etc/hosts
 加入IP节点名映射:

192.168.83.4 datanode-1
192.168.83.5 datanode-2
192.168.83.6 datanode-3
浏览器输入Yarn管理端地址,以下两个地址均可,Yarn启动后会确定其中一个为活动地址,若输入的是HA备份地址,会重定向到活动地址:

http://datanode-2:8088/cluster
http://datanode-1:8088/cluster
已完成任务列表中蓝色框标注的就是刚才执行的任务job_1640683809954_0003。

 4) 结尾
ZooKeeper集群已经加入系统自启动,方便反复开关OS的学习场景。

Hadoop启动顺序:

start-dfs.sh
start-yarn.sh
mapred --daemon start historyserver
Hadoop停止顺序:

stop-yarn.sh
stop-dfs.sh
jps |grep JobHistoryServer|awk '{print $1}'|xargs kill -9
7. 结束
整个Hadoop高可用集群及相关系统的部署、配置和验证就正式结束了。Hadoop集群作为当今大数据技术的基础数据底座非常重要,尽管部署过程非常复杂,步骤特别多,不过本文尽可能对每一步都做到细致入微,目的是让初学者手把手的照着做,也能正确部署好Hadoop平台,为后续的大数据技术学习,解决一入门就遇到这个高门槛。

参考:大数据技术训练舱:从零开始部署Hadoop3高可用集群(基于CentOS7)_centos7上hadoop集群改为高可用_守护石技术研究的博客-CSDN博客

你可能感兴趣的:(hadoop,大数据,hdfs)