HA(高可用)完全分布式集群部署

一、集群整体方案设计

hd01hd02hd03作用
NameNode(主)在这里插入图片描述activeNN
NameNode(备)在这里插入图片描述standbyNN
DFSZKFailoverController在这里插入图片描述在这里插入图片描述故障自动转移
JournalNode在这里插入图片描述在这里插入图片描述在这里插入图片描述Namenode数据同步
DataNode在这里插入图片描述在这里插入图片描述在这里插入图片描述数据节点
ResourceManager(主)在这里插入图片描述主资源管理进程
ResourceManager(备)在这里插入图片描述备份资源管理
NodeManager在这里插入图片描述在这里插入图片描述在这里插入图片描述节点管理
jobHistoryServer在这里插入图片描述历史服务
chronyd在这里插入图片描述在这里插入图片描述在这里插入图片描述时间同步
zookeeper在这里插入图片描述在这里插入图片描述在这里插入图片描述集群管理
JDK在这里插入图片描述在这里插入图片描述在这里插入图片描述java开发包

二、集群部署前的准备

  • 硬件选择:

    三台centos7系统的虚拟机

  • 服务选择:

    jdk-8u111-linux-x64.tar.gz
    zookeeper-3.4.5-cdh5.14.2.tar.gz
    hadoop-2.6.0-cdh5.14.2.tar.gz


三、集群部署服务

3.1 免密设置

  • 生成ssh公钥;
ssh-keygen -t rsa -P ''

  • 免密设置:每台依次执行,将公钥发送到各个服务器上;
ssh-copy-id hd01
ssh-copy-id hd02
ssh-copy-id hd03

在这里插入图片描述


3.2 服务器时钟同步

依次执行如下操作,指定上层NTP服务器为阿里云提供的公网NTP服务器:

# 安装chrony
yum -y install chrony
# 配置chrony,记得将默认的注释掉
vi /etc/chrony.conf

server ntp1.aliyun.com 
server ntp2.aliyun.com 
server ntp3.aliyun.com

# 启动chrony
systemctl start chronyd

在这里插入图片描述


3.3 psmidc安装

安装linux工具包psmisc,Namenode主备切换时需用到,只需安装至两台Namenode上即可;

[root@hd01 ~]# yum install -y psmisc

3.4 JDK安装配置

先在单台节点上安装,之后通过scp命令将文件发送到其他节点;

  • 解压安装包
[root@hd01 package]# tar -zxvf jdk-8u111-linux-x64.tar.gz -C /opt/software/

  • 配置环境变量
# 编辑环境变量,这里博主统一写入单独文件内,也可以在profile内编辑
[root@hd01 ~]# vi /etc/profile.d/my.sh


#JAVA_HOME
export JAVA_HOME=/opt/software/jdk180
export PATH=$PATH:$JAVA_HOME/bin
export CLASS_PATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar


# 重启环境变量
[root@hd01 ~]# source /etc/profile

# 测试环境
[root@hd01 ~]# java -version

  • 使用远程传输将文件发送至其余节点,发送完重启环境变量测试即可;
# 将jdk服务发送至其余节点
[root@hd01 software]# scp -r /opt/software/ root@hd02:/opt
[root@hd01 software]# scp -r /opt/software/ root@hd03:/opt
# 将环境变量配置文件发送至其余节点
[root@hd01 software]# scp -r /etc/profile.d/my.sh root@hd02:/etc/profile.d/
[root@hd01 software]# scp -r /etc/profile.d/my.sh root@hd03:/etc/profile.d/

3.5 配置Zookeeper集群

先在单台节点上安装,之后通过scp命令将文件发送到其他节点上分别设置;

  • 解压安装包
[root@hd01 package]# tar -zxvf zookeeper-3.4.5-cdh5.14.2.tar.gz -C /opt/software

  • 配置环境变量
[root@hd01 ~]# vi /etc/profile.d/my.sh

#ZK_HOME
export ZK_HOME=/opt/software/zookeeper345
export PATH=$PATH:$ZK_HOME/bin

  • 进入${zookeeper_home}conf目录编辑配置文件:
# 复制并编辑
[root@hd01 conf]# cp zoo_sample.cfg zoo.cfg
[root@hd01 conf]# vi zoo.cfg

# 设置数据目录
dataDir=/opt/software/zookeeper345/data
# 配置集群,hd01等为博主设置的主机名,需要修改为你所对应的主机名
server.1=hd01:2888:3888
server.2=hd01:2888:3888
server.3=hd01:2888:3888

在这里插入图片描述


  • 在zoo.cfg配置的datadir目录下创建myid,并输入对应的主机序号,对应server后的序号
[root@hd01 conf]# cd /opt/software/zookeeper345/
[root@hd01 zookeeper345]# mkdir data
[root@hd01 zookeeper345]# cd data/
[root@hd01 data]# echo 1 > myid

  • 使用远程传输将文件发送至其余节点,记得将其余节点中的myid改成zoo.cfg中对应的序号
# 将环境变量配置文件发送至其余节点
[root@hd01 ~]# scp -r /etc/profile.d/my.sh root@hd02:/etc/profile.d/
[root@hd01 ~]# scp -r /etc/profile.d/my.sh root@hd03:/etc/profile.d/
#将zookeeper服务发送至其余节点
[root@hd01 data]# scp -r /opt/software/zookeeper345/ root@hd02:/opt/software/
[root@hd01 data]# scp -r /opt/software/zookeeper345/ root@hd03:/opt/software/

  • 重启环境变量,启动zookeeper
# 启动zookeeper服务
[root@hd01 ~]# zkServer.sh start

# jps查看zookeeper进程
[root@hd01 ~]# jps
10452 QuorumPeerMain
10539 Jps

3.6 配置Hadoop集群

先在单台节点上安装,之后通过scp命令将文件发送到其他节点上分别设置

  • 解压安装包;
[root@hd01 package]# tar -zxvf hadoop-2.6.0-cdh5.14.2.tar.gz -C /opt/software/

  • 配置环境变量
#HADOOP_HOME
export HADOOP_HOME=/opt/software/hadoop260
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
export HADOOP_INSTALL=$HADOOP_HOME

  • 进入${hadoop_home}创建以下文件夹;
[root@hd01 hadoop260]# mkdir tmp dfs
[root@hd01 hadoop260]# cd dfs
[root@hd01 dfs]# mkdir journalnode_data edits datanode_data namenode_data
  • 进入${hadoop_home}etc/hadoop目录,编辑如下配置;

hadoop-env.sh

# 编辑hadoop-env.sh
[root@hd01 hadoop]# vi hadoop-env.sh

#配置JAVA_HOME/HADOOP_CONF_DIR目录
export JAVA_HOME=/opt/software/jdk180
export HADOOP_CONF_DIR=/opt/software/hadoop260/etc/hadoop

core-site.xml

# 编辑core-site.xml
[root@hd01 hadoop]# vi core-site.xml

<configuration>
<!--指定hadoop集群在zookeeper上注册的节点名-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hacluster</value>
</property>
<!--指定hadoop运行时产生的临时文件-->
<property>
<name>hadoop.tmp.dir</name>
<value>file:///opt/software/hadoop260/tmp</value>
</property>
<!--设置缓存大小 默认4KB-->
<property>
<name>io.file.buffer.size</name>
<value>4096</value>
</property>
<!--指定zookeeper的存放地址-->
<property>
<name>ha.zookeeper.quorum</name>
<value>hd01:2181,hd02:2181,hd03:2181</value>
</property>
<!--配置允许root代理访问主机节点-->
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<!--配置该节点允许root用户所属的组-->
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
</configuration>

hdfs-site.xml

# 编辑hdfs-site.xml
[root@hd01 hadoop]# vi hdfs-site.xml

<configuration>
<property>
<!--数据块默认大小128M-->
<name>dfs.block.size</name>
<value>134217728</value>
</property>
<property>
<!--副本数量 不配置默认为3-->
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<!--namenode节点数据(元数据)的存放位置-->
<name>dfs.name.dir</name>
<value>file:///opt/software/hadoop260/dfs/namenode_data</value>
</property>
<property>
<!--datanode节点数据(元数据)的存放位置-->
<name>dfs.data.dir</name>
<value>file:///opt/software/hadoop260/dfs/datanode_data</value>
</property>
<property>
<!--开启hdfs的webui界面-->
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<!--datanode上负责进行文件操作的线程数-->
<name>dfs.datanode.max.transfer.threads</name>
<value>4096</value>
</property>
<property>
<!--指定hadoop集群在zookeeper上的注册名-->
<name>dfs.nameservices</name>
<value>hacluster</value>
</property>
<property>
<!--hacluster集群下有两个namenode分别是nn1,nn2-->
<name>dfs.ha.namenodes.hacluster</name>
<value>nn1,nn2</value>
</property>
<!--nn1的rpc、servicepc和http通讯地址-->
<property>
<name>dfs.namenode.rpc-address.hacluster.nn1</name>
<value>hd01:9000</value>
</property>
<property>
<name>dfs.namenode.servicepc-address.hacluster.nn1</name>
<value>hd01:53310</value>
</property>
<property>
<name>dfs.namenode.http-address.hacluster.nn1</name>
<value>hd01:50070</value>
</property>
<!--nn2的rpc、servicepc和http通讯地址-->
<property>
<name>dfs.namenode.rpc-address.hacluster.nn2</name>
<value>hd02:9000</value>
</property>
<property>
<name>dfs.namenode.servicepc-address.hacluster.nn2</name>
<value>hd02:53310</value>
</property>
<property>
<name>dfs.namenode.http-address.hacluster.nn2</name>
<value>hd02:50070</value>
</property>
<property>
<!--指定Namenode的元数据在JournalNode上存放的位置-->
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hd01:8485;hd02:8485;hd03:8485/hacluster</value>
</property>
<property>
<!--指定JournalNode在本地磁盘的存储位置-->
<name>dfs.journalnode.edits.dir</name>
<value>/opt/software/hadoop260/dfs/journalnode_data</value>
</property>
<property>
<!--指定namenode操作日志存储位置-->
<name>dfs.namenode.edits.dir</name>
<value>/opt/software/hadoop260/dfs/edits</value>
</property>
<property>
<!--开启namenode故障转移自动切换-->
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<!--配置失败自动切换实现方式-->
<name>dfs.client.failover.proxy.provider.hacluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<!--配置隔离机制-->
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<!--配置隔离机制需要SSH免密登录-->
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<property>
<!--hdfs文件操作权限 false为不验证-->
<name>dfs.premissions</name>
<value>false</value>
</property>
</configuration>

mapred-site.xml

# 编辑mapred-site.xml
[root@hd01 hadoop]# cp mapred-site.xml.template mapred-site.xml
[root@hd01 hadoop]# vi mapred-site.xml

<configuration>
<property>
<!--指定mapreduce在yarn上运行-->
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<!--配置历史服务器地址-->
<name>mapreduce.jobhistory.address</name>
<value>hd01:10020</value>
</property>
<property>
<!--配置历史服务器webUI地址-->
<name>mapreduce.jobhistory.webapp.address</name>
<value>hd01:19888</value>
</property>
<property>
<!--开启uber模式-->
<name>mapreduce.job.ubertask.enable</name>
<value>true</value>
</property>
</configuration>

yarn-site.xml

# 编辑yarn-site.xml
[root@hd01 hadoop]# vi yarn-site.xml

<configuration>
<property>
<!--开启yarn高可用-->
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<!--指定Yarn集群在zookeeper上注册的节点名-->
<name>yarn.resourcemanager.cluster-id</name>
<value>hayarn</value>
</property>
<property>
<!--指定两个resourcemanager的名称-->
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<!--指定rm1的主机-->
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hd02</value>
</property>
<property>
<!--指定rm2的主机-->
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hd03</value>
</property>
<property>
<!--配置zookeeper的地址-->
<name>yarn.resourcemanager.zk-address</name>
<value>hd01:2181,hd02:2181,hd03:2181</value>
</property>
<property>
<!--开启yarn恢复机制-->
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<property>
<!--配置执行resourcemanager恢复机制实现类-->
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<property>
<!--指定主resourcemanager的地址-->
<name>yarn.resourcemanager.hostname</name>
<value>hd03</value>
</property>
<property>
<!--nodemanager获取数据的方式-->
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<!--开启日志聚集功能-->
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<!--配置日志保留7天-->
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
</configuration>

slaves

设置集群
[root@hd01 hadoop]# vi slaves

hd01
hd02
hd03

  • 使用远程传输将文件发送至其余节点
# 将环境变量配置文件发送至其余节点
[root@hd01 ~]# scp -r /etc/profile.d/my.sh root@hd02:/etc/profile.d/
[root@hd01 ~]# scp -r /etc/profile.d/my.sh root@hd03:/etc/profile.d/

#将hadoop服务发送至其余节点
[root@hd01 data]# scp -r /opt/software/hadoop260/ root@hd02:/opt/software/
[root@hd01 data]# scp -r /opt/software/hadoop260/ root@hd03:/opt/software/

3.7 启动Hadoop集群

  • 启动JournalNode(3个都启动)
hadoop-daemon.sh start journalnode

在这里插入图片描述


  • 格式化Namenode(只在hd01操作)
hdfs namenode -format

status:0表示格式化成功

在这里插入图片描述


  • 将Namenode(主)的元数据复制到Namenode(备)相同位置
scp -r /opt/software/hadoop260/dfs/namenode_data/current/ root@hd02:/opt/software/hadoop260/dfs/namenode_data

  • 在hd01或hd02格式化故障转移控制器zkfc
hdfs zkfc -formatZK
  • 在Namenode(主)上启动dfs服务,对应当前的hd01
start-dfs.sh

服务开启后进程如下:
在这里插入图片描述


  • 在ResourceManager(主)上启动yarn(当前的hd03)
start-yarn.sh

服务开启后进程如下:
在这里插入图片描述


  • 在Namenode(主)上启动history服务器(当前的hd01)
mr-jobhistory-daemon.sh start historyserver

服务开启后当前节点进程如下:

在这里插入图片描述


  • 在ResourceManager(备)上启动resourcemanager服务
yarn-deamon.sh start resourcemanager

服务开启后当前节点进程如下:

在这里插入图片描述

四、Hadoop集群检查

4.1 jps服务检查

# 查看所有节点上服务情况
jps

在这里插入图片描述


4.2 查看Namenode&ResourceManager状态

# 在Namenode(主)上查看服务状态(当前hd01)
hdfs haadmin -getServiceState nn1 	#active 
hdfs haadmin -getServiceState nn2 	#standby 
# 在Resourcemanager(主)上查看resourcemanager状态 (当前hd01)
yarn rmadmin -getServiceState rm1 	#standby 
yarn rmadmin -getServiceState rm2 	#active

Namenode&ResourceManager状态查询:

在这里插入图片描述


4.3 主备Namenode切换检查

在Namenode的active节点挂掉后,Namenode的standby会自动切换到active状态上;

# kill掉Namenode主节点 查看Namenode standby节点状态 
kill -9 ${NAMENODE_UID}  #kill主节点进程 
# 恢复后重新加入 
hadoop-deamon.sh start namenode #启动后也只是standby节点

kill进程后,启动Namenode再查看nn状态:
此时,虽然Namenode启动了,但是nn1由之前的actice变为standby状态;

在这里插入图片描述


4.4 集群二次启动

#在Namenode(主)上启动dfs(当前hd01) 
start-dfs.sh 
#在ResourceManager(主)上启动yarn (当前hd03)
start-yarn.sh 
#下面的应用于主ResourceManager挂掉的情况下
#在ResourceManager(备)上启动resourcemanager (当前hd02) 
yarn-daemon.sh start resourcemanager

PS:如果有写错或者写的不好的地方,欢迎各位在评论区留下宝贵的意见或者建议,敬上!如果这篇博客对您有帮助,希望您可以顺手帮我点个赞!不胜感谢!


原创作者:wsjslient

作者主页:https://blog.csdn.net/wsjslient


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值