上次记录了 hadoop 完全分布式搭建 (非高可用) https://www.cnblogs.com/nm666/p/11030932.html , 这次来学习 hadoop HA 搭建.
一, 原理机制
主备 NameNode
解决单点故障 (属性, 位置)
主 NameNode 对外提供服务, 备 NameNode 同步主 NameNode 元数据, 以待切换
所有 DataNode 同时向两个 NameNode 汇报数据块信息 (位置)
JNN: 集群 (属性)
standby: 备, 完成了 edits.log 文件的合并产生新的 image, 推送回 ANN
两种切换选择
手动切换: 通过命令实现主备之间的切换, 可以用 HDFS 升级等场合
自动切换: 基于 Zookeeper 实现
基于 Zookeeper 自动切换方案
ZooKeeper Failover Controller: 监控 NameNode 健康状态,
并向 Zookeeper 注册 NameNode
NameNode 挂掉后, ZKFC 为 NameNode 竞争锁, 获得 ZKFC 锁的 NameNode 变为 active
二, 步骤
集群规划
NN-1 | NN-2 | DN | ZK | ZKFC | JNN | |
---|---|---|---|---|---|---|
node01 | * | * | * | |||
node02 | * | * | * | * | * | |
node03 | * | * | * | |||
node04 | * | * |
1. 修改 hadoop.ev.sh 文件
- (hadoop3.x 中要求指定用户进程)
- export HDFS_ZKFC_USER=root
- export HDFS_JOURNALNODE_USER=root
2. 配置 hdfs-site.xml
- (这里配置有点多, 查看官方文档介绍: hadoop-3.2.0 doc HDFSHighAvailabilityWithQJM )
- dfs.nameservices - the logical name for this new nameservice
- (名称服务, 只是一个逻辑名称逻辑名称)
- <!-- 为这个 nameservice 选择一个逻辑名称, 例如 "mycluster", 并为这个配置选项的值使用这个逻辑名称. 您选择的名称是任意的. 它将用于配置并作为集群中绝对 HDFS 路径的权威组件.-->
- <property>
- <name>dfs.nameservices</name>
- <value>mycluster</value>
- </property>
- dfs.ha.namenodes.[nameservice ID] - unique identifiers for each NameNode in the nameservice
- (名称服务中每个 NameNode 的惟一标识符)
- <!-- 使用逗号分隔的 NameNode id 列表进行配置. datanode 将使用它来确定集群中的所有 namenode. 例如, 本文使用 "mycluster" 作为 nameservice ID, 并且我们集群规划使用 "node01","node02" 作为 namenode 的单独 ID, 可以这样配置:-->
- <property>
- <name>dfs.ha.namenodes.mycluster</name>
- <value>node01,node02</value>
- </property>
- <!-- 官网建议: HA 的最小 namenode 数量是两个, 但是您可以配置更多. 由于通信开销, 建议不超过 5 个 (建议使用 3 个 namenode)-->
- dfs.namenode.rpc-address.[nameservice ID].[name node ID] - the fully-qualified RPC address for each NameNode to listen on
- (namenode 的 rpc 服务器的监听地址)
- <property>
- <name>dfs.namenode.rpc-address.mycluster.node01</name>
- <value>node01:8020</value>
- </property>
- <property>
- <name>dfs.namenode.rpc-address.mycluster.node02</name>
- <value>node02:8020</value>
- </property>
- dfs.namenode.http-address.[nameservice ID].[name node ID] - the fully-qualified HTTP address for each NameNode to listen on
- (namenode 的 HTTP 服务器的监听地址, 与 rpc 同理只不过端口变为 9870)
- <property>
- <name>dfs.namenode.http-address.mycluster.node01</name>
- <value>node01:9870</value>
- </property>
- <property>
- <name>dfs.namenode.http-address.mycluster.node02</name>
- <value>node02:9870</value>
- </property>
- dfs.namenode.shared.edits.dir - the URI which identifies the group of JNs where the NameNodes will write/read edits
- (配置 JournalNodes 集群的 URI)
- <!-- 这是配置提供共享编辑存储的 journalnode 地址的地方, 这些地址由活动 nameNode 写入, 由备用 nameNode 读取, 以便与活动 nameNode 所做的所有文件系统更改保持最新. 虽然必须指定几个 JournalNode 地址, 但是应该只配置其中一个 uri.URI 的形式应该是: qjournal://*host1:port1*;*host2:port2*;*host3:port3*/*journalId*. 日志 ID 是这个名称服务的惟一标识符, 它允许一组日志节点为多个联合名称系统提供存储 -->
- <property>
- <name>dfs.namenode.shared.edits.dir</name>
- <value>qjournal://node01:8485;node02:8485;node03:8485/mycluster</value>
- </property>
- dfs.client.failover.proxy.provider.[nameservice ID] - the Java class that HDFS clients use to contact the Active NameNode
- (配置故障转移代理类)
- <property>
- <name>dfs.client.failover.proxy.provider.mycluster</name>
- <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
- </property>
- dfs.ha.fencing.methods - a list of scripts or Java classes which will be used to fence the Active NameNode during a failover
- (隔离方法; 确保当前时间点只有一个 namenode 处于 active 状态, jurnalnode 只允许 1 个 namenode 来读写数据, 但是也会出现意外的情况, 因此需要控制对方机器, 进行将自我提升 [active], 将对方降级 [standby])
- <property>
- <name>dfs.ha.fencing.methods</name>
- <value>sshfence</value>
- </property>
- <property>
- <name>dfs.ha.fencing.SSH.private-key-files</name>
- <value>/root/.SSH/id_rsa</value>
- </property>
- dfs.journalnode.edits.dir - the path where the JournalNode daemon will store its local state
- (journalnode 日志存放路径)
- <property>
- <name>dfs.journalnode.edits.dir</name>
- <value>/opt/tmp/hadoop/journalnode/data</value>
- </property>
- 3.core-site.xml
- (注意更改下 hadoop.tmp.dir 的路径, 与 node 的名称 [类似一个域名多 ip] )
- <configuration>
- <property>
- <name>fs.defaultFS</name>
- <value>hdfs://mycluster</value>
- </property>
- <property>
- <name>hadoop.tmp.dir</name>
- <value>/opt/tmp/hadoop/ha</value>
- </property>
- </configuration>
4. 自动故障转移配置 [zk]
再次回到 hdfs-site.xml 文件与 core-site.xml 配置中:
打开自动故障转移:
- The configuration of automatic failover requires the addition of two new parameters to your configuration. In your hdfs-site.xml file, add:
- <property>
- <name>dfs.ha.automatic-failover.enabled</name>
- <value>true</value>
- </property>
添加 zookeeper 的地址:
- This specifies that the cluster should be set up for automatic failover. In your core-site.xml file, add:
- <property>
- <name>ha.zookeeper.quorum</name>
- <value>node02:2181,node03:2181,node04:2181</value>
- </property>
5. 分发配置到其他节点
注意 workes 也要配置
scp -r hadoop-env.sh core-site.xml hdfs-site.xml node04:`pwd`
6. 安装 Zookeeper 及配置
安装: 略
配置 zoo.cfg:
- dataDir=/opt/tmp/zookeeper
- server.1=192.168.121.102:2888:3888
- server.2=192.168.121.103:2888:3888
- server.3=192.168.121.104:2888:3888
创建 myid[1 2 3 同理] :
- mkdir /opt/tmp/zookeeper
- echo 1> /opt/tmp/zookeeper/myid
7. 启动 Hadoop HA
启动 zookeeper 集群
zkServer.sh start
启动 jurnalnode 集群
hadoop-daemon.sh start journalnode
或者 hdfs --daemon start journalnode
启动第一台 namenode
- hdfs namenode -format
- hadoop-deamon.sh start namenode
或者 hdfs --daemon start namenode
剩余 namenode 启动做备
hdfs namenode -bootstrapStandby
启动 datanode 等节点
- start-dfs.sh
- Initializing HA state in ZooKeeper(在 ZooKeeper 中初始化 HA 状态)
- hdfs zkfc -formatZK
三, 测试
访问 node01:9870: Overview 'node02:8020' (active)
访问 node02:9870: Overview 'node02:8020' (standby)
1.namenode 挂掉的情况
hadoop-daemon.sh stop namenode 或者
hdfs --daemon stop namenode
2.ZKFC 挂掉的情况
hadoop-daemon.sh stop zkfc 或者
- hdfs --daemon stop zkfc
来源: http://www.bubuko.com/infodetail-3109388.html