一. Hadoop 高可用原理
背景: 完全分布式只有一个namenode,存在单点故障问题.
解决: 高可用有2个namenode(active|standy热备),但同一时间只有一个对外提供服务.
问题: 一旦active宕机,stanby需立即切换为actice,让集群一直有namenode.
实现: 保证两件事:1.元数据一致 2.无缝衔接
(一). stanby namenode 和 active namenode的元数据 保持一致
namenode: fsiamge (集群启动时产生的初始文件) + edits (后续运行中产生的文件)
fsimage文件:
最开始 hdfs 格式化的生成最初的 fsimage 文件 /后面的 fsiamge 文件: 通过最初的 faimage + edits 文件合并得来的
faimage 文件要想保证一致, 只需要保证: 格式化时候 faimage 文件保持一致.(最开始在一个 namenode 进行格式化生成 fsimage 文件, 将这个 fsiamge 文件发送给另一个 namenode 即可)
edits文件:
只要集群一启动, 持续不断的产生在 active namenode 中.
如何保持 edits 文件在 stanby 中的更新:
将 edits 文件放在一个共享平台 (hadoop2.0自带的 Quorum journal manager 共享日志管理平台,节点奇数 ), standby 监听这个共享平台的数据, 一旦数据更新就将 edits 数据拉取到 stanby 本地
(二). stanby 需要能立即感知 active 状态变化
使用 zk 保存 active namenode 0 / 1 的状态 (znode 1M 1kb)
active namenode 将状态信息写入到 zookeeper 中的一个 znode 上 stanby namenode 对这个 znode 添加监听 (getData) 一旦发现这个 znode 内容变化, 立即将自己的状态切换为 active
但是为了防止脑裂现象 (两个 active namenode, 产生原因是 active 由于网络或其它原因未及时回复standy 导致standy 误以为对方已经挂了, 导致双双 active), 所以stanby 切换之前会远程向原来的 actice 发送一个 shell 脚本(ssh 远程命令, kill -9 xx 甚至 init 0), 以此保证原来的 active 确实宕机的.
每个 namenode 都有一个助理 zkfc : Zookeeper Failover Controller, zk 失败控制器. ( 用来监控每一个namenode的健康状况, 将信息写入zk中. 因为 namenode 主要工作是接收客户端的读写请求, 所以将状态信息写入 zk 或 拉取 zk 中信息不应该使用太多资源, 因此使用 zkfc 来完成. )
注意:在hadoop的HA中, 没有 secondary namenode, stanby namenode 负责原先 sn 元数据合并的任务.
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wdVD92BR-1605771542787)(Hadoop 高可用式.assets/ha.jpg)]](https://img-blog.csdnimg.cn/20201119154104986.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3F4azUwNTU=,size_16,color_FFFFFF,t_70#pic_center)
二. 集群规划
hadoop01Hadoop02hadoop03hdfs (HA)namenodenamenodezkfczkfcjournalnodejournalnodejournalnodedatanodedatanodedatanodemapreduceyarn (HA)resourcemanagerresourcemanagernodemanagernodemanagernodemanagerzookeeperquorumpeermainquorumpeermainquorumpeermain675
三. 前置条件
1. ip
2. 主机名
3. 主机映射
4. 防火墙
5. selinux
6. sudoers (非root用户搭建需配置)
7. 免密登陆
8. 时间同步
四. Hadoop 高可用搭建
卸载之前安装的Hadoop
1.关闭集群
stop-all.sh
2.删除安装包
rm -rf /opt/hadoop-2.7.6
3.删除数据目录
rm -rf /home/hadoop/data/hadoopdata
上传、解压、配置环境变量
tar -zxvf hadoop-2.7.7.tar.gz -C /opt/
vim /etc/profile
export HADOOP_HOME=/opt/hadoop-2.7.7
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
source /etc/profile
[root@hadoop01 soft]# hadoop version
Hadoop 2.7.7
Subversion Unknown -r c1aad84bd27cd79c3d1a7dd58202a8c3ee1ed3ac
Compiled by stevel on 2018-07-18T22:47Z
Compiled with protoc 2.5.0
From source with checksum 792e15d20b12c74bd6f19a1fb886490
This command was run using /opt/hadoop-2.7.7/share/hadoop/common/hadoop-common-2.7.7.jar
修改 Hadoop 配置文件
hadoop-env.sh
export JAVA_HOME=/opt/jdk1.8.0_73
core-site.xml
fs.defaultFS
hdfs://wangdfs/
hadoop.tmp.dir
/home/hadoop/data/hadoopdata/
ha.zookeeper.quorum
hadoop01:2181,hadoop02:2181,hadoop03:2181
hdfs-site.xml
dfs.replication
2
dfs.nameservices
wangdfs
dfs.ha.namenodes.wangdfs
nn1,nn2
dfs.namenode.rpc-address.wangdfs.nn1
hadoop01:8020
dfs.namenode.http-address.wangdfs.nn1
hadoop01:50070
dfs.namenode.rpc-address.wangdfs.nn2
hadoop02:8020
dfs.namenode.http-address.wangdfs.nn2
hadoop02:50070
dfs.namenode.shared.edits.dir
qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485/wangdfs
dfs.journalnode.edits.dir
/home/hadoop/data/hadoopdata/journalnodedata
dfs.ha.automatic-failover.enabled
true
dfs.client.failover.proxy.provider.wangdfs
org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
dfs.ha.fencing.methods
sshfence
shell(/bin/true)
dfs.ha.fencing.ssh.private-key-files
/home/hadoop/.ssh/id_rsa
dfs.ha.fencing.ssh.connect-timeout
30000
mapred-site.xml
mv mapred-site.xml.template mapred-site.xml
mapreduce.framework.name
yarn
mapreduce.jobhistory.address
hadoop03:10020
mapreduce.jobhistory.webapp.address
hadoop03:19888
yarn-site.xml
yarn.resourcemanager.ha.enabled
true
yarn.resourcemanager.cluster-id
wangyarn
yarn.resourcemanager.ha.rm-ids
rm1,rm2
yarn.resourcemanager.hostname.rm1
hadoop02
yarn.resourcemanager.hostname.rm2
hadoop03
yarn.resourcemanager.zk-address
hadoop01:2181,hadoop02:2181,hadoop03:2181
yarn.nodemanager.aux-services
mapreduce_shuffle
yarn.log-aggregation-enable
true
yarn.log-aggregation.retain-seconds
86400
yarn.resourcemanager.recovery.enabled
true
yarn.resourcemanager.store.class
org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore
slaves, 注意多余空格
hadoop01
hadoop02
hadoop03
远程发送 Hadoop 安装包、/etc/profile 配置文件
scp -r /opt/hadoop-2.7.7 hadoop02:/opt/
scp -r /opt/hadoop-2.7.7 hadoop03:/opt/
scp /etc/profile hadoop02:/etc/
scp /etc/profile hadoop03:/etc/
source /etc/profile
格式化、启动
1.在每个节点都启动 zookeeper
zkServer.sh start
2.在每个节点都启动 jounalnode日志平台
hadoop-daemon.sh start journalnode
3.选择一个namenode节点初始化文件系统, hadoop01
hdfs namenode -format
成功: Storage directory /home/hadoop/data/hadoopdata/dfs/name has been successfully formatted.
注意:
成功的格式化只能有一次,若想重新初始化: rm -r /home/hadoop/data/hadoopdata
报错之后按照错误提示修改后重新格式化即可.
4.将 hadoop01 初始化元数据发送至 hadoop02, 保证初始 fsiamge 文件一致
scp -r /home/hadoop/data/hadoopdata hadoop02:/home/hadoop/data/
5.初始化 zkfc, 监控 namenode 的健康状况并写入 zk, 在 hadoop01 或者 hadoop02, 仅执行一次
hdfs zkfc -formatZK
成功输出: Successfully created /hadoop-ha/wangdfs in ZK.
完成后,则会在 zk 中创建一个节点 /hadoop-ha/wangdfs, 存储两个 namenode 的状态信息.
注意: 在此是初始化 zkfc 并非启动. 启动 zkfc 是伴随 hdfs 启动后才可 jps 查看相关进程.
6.启动 (注意顺序)
先在三台机器上分别启动 zookeeper, 再在1节点或者2节点启动hdfs, 然后在2节点(或者3节点)上启动yarn, 最后在3节点(或者2节点上)启动resourcemanager.
①节点1 2 3 zkServer.sh start
②节点1 start-dfs.sh
③节点3 start-yarn.sh [此时仅启动本节点 rm 和三个 nm]
④节点2 yarn-daemon.sh start resourcemanager [启动另一节点的 rm ,实现高可用]
启动成功后查看 jps 相关进程:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-94gs3eCi-1605771542791)(Hadoop 高可用式.assets/image-20201119151115963.png)]](https://img-blog.csdnimg.cn/20201119154125543.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3F4azUwNTU=,size_16,color_FFFFFF,t_70#pic_center)
启动成功后查看 zk 节点:
[zk: localhost:2181(CONNECTED) 2] ls /
[zookeeper, yarn-leader-election, hadoop-ha, rmstore]
[zk: localhost:2181(CONNECTED) 3] ls /hadoop-ha
[wangdfs]
检查高可用
namenode
http://hadoop01:50070
http://hadoop02:50070
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SMLnODQB-1605771542792)(Hadoop 高可用式.assets/image-20201119153351445.png)]](https://img-blog.csdnimg.cn/20201119154140515.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3F4azUwNTU=,size_16,color_FFFFFF,t_70#pic_center)
测试高可用:
kill 掉 active namenode 查看, stanby 是否会自动迅速切换为 active.启动之前 kill 的 active namenode 查看其状态
结果, stanby 自动无缝切换成功 , active 重启后为 stanby.
resourcemanager
http://hadoop02:8088
http://hadoop03:8088
yarn 的高可用表现形式为: 打开网页自动跳转到 active 页面
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TLdMrdmp-1605771542793)(Hadoop 高可用式.assets/image-20201119153643435.png)]](https://img-blog.csdnimg.cn/20201119154151253.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3F4azUwNTU=,size_16,color_FFFFFF,t_70#pic_center)
测试高可用方法, 雷同.
关闭 (注意顺序, 与启动顺序相反)
①节点1 stop-dfs.sh
②节点3 stop-yarn.sh [此时仅关闭本节点 rm 和三个 nm]
③节点2 yarn-daemon.sh stop resourcemanager [关闭另一节点的 rm ]
④节点1 2 3 zkServer.sh stop
|