机器学习, 数据采集, 数据分析, web网站,IS-RPA,APP
案例分享 其他经验 Hadoop生态圈 hadoop高可用集群 • 1 回帖 • 822 浏览 • 2019-11-27 10:58:58
经验 | Hadoop 生态圈 - 高可用集群
Hadoop 生态圈 - 高可用集群
Hadoop 生态圈即全部组件 - 原创 wangwei(qq 邮箱:1040691703@qq.com) 转载复制请联系作者
高可用集群自动故障转移工作 机制
1) 故障检测:
** 故障检测:** 集群中的每个 NameNode 在 ZooKeeper 中维护了一个持久会话,如果
机器崩溃,ZooKeeper 中的会话将终止,ZooKeeper 通知另一个 NameNode 需要触发故障转
移。
2)现役 NameNode 选择:
** 现役 NameNode 选择:**ZooKeeper 提供了一个简单的机制用于唯一的选择一个节点
为 active 状态。如果目前现役 NameNode 崩溃,另一个节点可能从 ZooKeeper 获得特殊的
排外锁以表明它应该成为现役 NameNode。
ZKFC 是自动故障转移中的另一个新组件,是 ZooKeeper 的客户端,也监视和管理
NameNode 的状态。每个运行 NameNode 的主机也运行了一个 ZKFC 进程,ZKFC 负责:
**1)健康监测:**ZKFC 使用一个健康检查命令定期地 ping 与之在相同主机的 NameNode,
只要该 NameNode 及时地回复健康状态,ZKFC 认为该节点是健康的。如果该节点崩溃,冻
结或进入不健康状态,健康监测器标识该节点为非健康的。
**2 )ZooKeeper 会话管理:** 当本地 NameNode 是健康的,ZKFC 保持一个在 ZooKeeper
中打开的会话。如果本地 NameNode 处于 active 状态,ZKFC 也保持一个特殊的 znode 锁,
该锁使用了 ZooKeeper 对短暂节点的支持,如果会话终止,锁节点将自动删除。
**3)于 基于 ZooKeeper 的选择:** 如果本地 NameNode 是健康的,且 ZKFC 发现没有其它的
节点当前持有 znode 锁,它将为自己获取该锁。如果成功,则它已经赢得了选择,并负责运
行故障转移进程以使它的本地 NameNode 为 Active。故障转移进程与前面描述的手动故障转
移相似,首先如果必要保护之前的现役 NameNode,然后本地 NameNode 转换为 Active 状
态。
高可用 集群配置
环境准备
1. 修改 IP
2. 修改主机名及主机名和 IP 地址的映射
3. 关闭防火墙
4. ssh 免密登录
5. 安装 JDK,配置环境变量等
规划
表 3-1
|
master1
|
slave1
|
slave2
|
| NameNode | NameNode | |
| JournalNode |
JournalNode
|
JournalNode
|
| DataNode |
DataNode
| DataNode |
|
ZK
| ZK |
ZK
|
| | ResourceManager | |
| NodeManager |
NodeManager
|
NodeManager
|
查看 / 修改 hadoop 配置文件:
[hadoop@master1 module]$ vim /opt/module/hadoop-2.6.0/etc/hadoop/core-site.xml [hadoop@master1 module]$ vim /opt/module/hadoop-2.6.0/etc/hadoop/hdfs-site.xml [hadoop@master1 module]$ vim /opt/module/hadoop-2.6.0/etc/hadoop/yarn-site.xml [hadoop@master1 module]$ vim /opt/module/hadoop-2.6.0/etc/hadoop/mapred-site.xml
配置 HDFS-HA 集群
1. 官方地址:
2. 创建 ha 文件夹
[hadoop@master1 module]$ mkdir ha
3. 将的 hadoop-2.6.0 拷贝到 /ha/ 目录下
[hadoop@master1 module]$ cp -r hadoop-2.6.0/ ha/
4. 重新配置 hdfs-site.xml
[hadoop@master1 module]$ vim ha/hadoop-2.6.0/etc/hadoop/hdfs-site.xml
全替换为如下内容:
指定了两个 NameNode,和它的 rpa 的通信地址,以及它的 HTTP 50070 web 访问地址
<configuration> <property> <name>dfs.replication</name> <value>1</value> <description>副本个数</description> </property> <property> <name> dfs.nameservices </name> <value> 总服务名字 </value> </property> <property> <name> dfs.ha.namenodes.mycluster </name> <value> nn1,nn2 </value> <description>NameNode取个别名</description> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn1</name> <value>master1:8020</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>slave1:8020</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn1</name> <value>master1:50070</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn2</name> <value>slave1:50070</value> </property> <property> <name>dfs.namenode.shared.edits.dir</name> <value>协议://master1:8485;slave1:8485;slave2:8485/总服务名字</value> <description>协议</description> </property> <property> <name>dfs.client.failover.proxy.provider.mycluster</name> <value>代理类/value> </property> <property> <name>dfs.permissions.enable</name> <value>false</value> </property> <property> <name>dfs.ha.fencing.methods</name> <value>隔离机制</value> </property> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>ssh私钥地址</value> <description>ssh私钥地址</description> </property> </configuration>
5、配置文件系统 core-site.xml
[hadoop@master1 module]$ vim ha/hadoop-2.6.0/etc/hadoop/core-site.xml
全替换为如下内容:
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://前面的总服务名字</value> <description></description> </property> <!-- 指定节点上本地的hadoop运行时产生的临时文件存储目录 --> <property> <name>hadoop.tmp.dir</name> <value>节点上本地的hadoop临时文件夹(前面自己自定义的目录)</value> </property> <property> <name>dfs.journalnode.edits.dir</name> <value>自定义jn的data数据存储目录</value> <description></description> </property> </configuration>
5、删除 data/ 和 logs/ 目录
因为是新的集群、需要重新格式化 NameNode
[hadoop@master1 hadoop-2.6.0]$ rm -rf data/ logs/
6、分发 ha/ 到从机
[hadoop@master1 module]$ xsync ha/
启动 HDFS-HA 高可用集群
1. 在各个 JournalNode 节点上,输入以下命令启动 journalnode 服务
[hadoop@master1 hadoop-2.6.0]$ sbin/hadoop-daemon.sh start journalnode [hadoop@master1 hadoop-2.6.0]$ sbin/hadoop-daemon.sh start journalnode [hadoop@master1 hadoop-2.6.0]$ sbin/hadoop-daemon.sh start journalnode [hadoop@master1 hadoop-2.6.0]$ jps 8176 Jps 8129 JournalNode
2. 查看此时目录下新生成的 logs/
都是 journalnode 启动后的日志文件
[hadoop@master1 hadoop-2.6.0]$ ll logs total 44 -rw-rw-r-- 1 hadoop hadoop 33103 Nov 26 01:40 hadoop-hadoop-journalnode-master1.log -rw-rw-r-- 1 hadoop hadoop 716 Nov 26 01:40 hadoop-hadoop-journalnode-master1.out -rw-rw-r-- 1 hadoop hadoop 2805 Nov 26 01:38 hadoop-hadoop-journalnode-master1.out.1 -rw-rw-r-- 1 hadoop hadoop 0 Nov 26 01:38 SecurityAuth-hadoop.audit
3. 在 [nn1] 上,对其进行格式化,并启动
[hadoop@master1 hadoop-2.6.0]$ bin/hdfs namenode -format [hadoop@master1 hadoop-2.6.0]$ sbin/hadoop-daemon.sh start namenode [hadoop@master1 hadoop-2.6.0]$ jps 6305 JournalNode 6625 Jps 6547 NameNode
4. 在 [nn2] 上,同步 nn1 的元数据信息
[hadoop@slave1 hadoop-2.6.0]$ bin/hdfs namenode -bootstrapStandby
出现如下反馈信息,则 OK!
5. 启动 [nn2] 的 NameNode
[hadoop@slave1 hadoop-2.6.0]$ sbin/hadoop-daemon.sh start namenode [hadoop@slave1 hadoop-2.6.0]$ jps 8900 Jps 8550 JournalNode 8830 NameNode
6. 查看 web 页面显示,如图所示
访问 web 网页查看:
7. 在 [nn1] 上,启动所有 datanode
关系:start 调 hadoop-daemons 的群起脚本 ,daemons 去调用遍历 slaves.sh 调用它们 daemon 命令。
群起(daemons)、单启(daemon)都可以
[hadoop@master1 hadoop-2.6.0]$ sbin/hadoop-daemons.sh start datanode
datan****ode 虽然启动了,但是现在只能看,不能用
8. 将 [nn1] 切换为 Active
[hadoop@master1 hadoop-2.6.0]$ bin/hdfs haadmin -transitionToActive nn1
激活了 nn1
9. 查看是否 Active
[hadoop@master1 hadoop-2.6.0]$ bin/hdfs haadmin -getServiceState nn1
配置 HDFS-HA 自动故障转移机制
1. 具体配置
- (1)在 hdfs-site.xml 中增加
<property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property>
- (2)在 core-site.xml 文件中增加
<property> <name>ha.zookeeper.quorum</name> <value>master1:2181,slave1:2181,slave2:2181</value> </property>
- (3)分发
[hadoop@master1 hadoop-2.6.0]$ xsync etc/hadoop
2. 启动
- (1)关闭所有 HDFS 服务:
[hadoop@master1 hadoop-2.6.0]$ sbin/stop-dfs.sh
- (2)群起 Zookeeper 集群:
[hadoop@master1 hadoop-2.6.0]$ zk.sh start
- (3)初始化 HA 在 Zookeeper 中状态:
[hadoop@master1 hadoop-2.6.0]$ bin/hdfs zkfc -formatZK
此时在 Zk 客户端 可以查看到初始化了什么内容(创建了 HA 节点)
[hadoop@master1 zookeeper-3.4.5]$ bin/zkCli.sh ......... [zk: localhost:2181(CONNECTED) 2] ls / [cluster, ...., zookeeper, hadoop-ha, ....,hbase] [zk: localhost:2181(CONNECTED) 3] ls /hadoop-ha [mycluster] [zk: localhost:2181(CONNECTED) 4] ls /hadoop-ha/mycluster []
- (4)启动 HDFS 服务:
[hadoop@master1 hadoop-2.6.0]$ sbin/start-dfs.sh
查看启动的进程
- (5)在各个 NameNode 节点上启动 DFSZK Failover Controller,先在哪台机器启动,哪
个机器的 NameNode 就是 Active NameNode
[hadoop@master1 hadoop-2.6.0]$ sbin/hadoop-daemin.sh start zkfc
3. 验证
- (1)将 Active NameNode 进程 kill
kill -9 namenode 的进程 id [hadoop@master1 hadoop-2.6.0]$ jps 10535 Jps 10008 DataNode 10201 JournalNode 9514 QuorumPeerMain 10381 DFSZKFailoverController 9902 NameNode [hadoop@master1 hadoop-2.6.0]$ kill -9 9902
**PS:此时 web 端可以看到,master1 的页面已经死掉了。而 slave1 的页面 ****standby **** 由变成了 **active
** 此时在启动 master1 的 nodename,那么他就是 **standby 因为 slacve1 的锁没掉
hadoop@master1 hadoop-2.6.0]$ sbin/hadoop-daemon.sh start namenode
- (2)将 Active NameNode 机器断开网络(没测试)
service network stop
👏