HDFS HA的架构
-
针对NameNode启用两台物理主机,一台Active,一台Standby。
-
Active NameNode主机负责所有操纵,Standby NameNode主机待命。
-
Journal是单独的进程(JournalNodes,JNs),负责Active NameNode主机和Standby NameNode主机之间的同步通信。
-
Active NameNode的修改动作会写入到JNs,Standby NameNode会从JNs中读取edit logs。Standby NameNode会持续观察edit logs的变化。一旦edit logs发生变化,Standby NameNode会将变化同步到自己的名字空间。
-
DataNode会同时向Active NameNode和Standby NameNode发送心跳信息和block info。
-
同时只能有一个Active NameNode。当出现两个Active NameNode时称之为“spit-brain”。
-
只能Active NameNode写入,而Standby NameNode负责读取。
HA的配置
1. 配置hdfs-site.xml
配置nameservices的逻辑名。这里任意给一个mycluster。
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
2. 配置nameservices中的每一个NameNode
接着上边的逻辑名称mycluster,给出NameNode ID:nn1和nn2,用逗号分隔。
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
注意:目前hadoop2.9.2最多只支持2个NameNode。
3. 配置每个NameNode的RPC地址
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>machine1.example.com:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>machine2.example.com:8020</value>
</property>
4. 配置每个NameNode的Web UI
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>machine1.example.com:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>machine2.example.com:50070</value>
</property>
htts使用形如:dfs.namenode.https-address.mycluster.nn1
5. 配置NameNode的共享edit logs目录
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node1.example.com:8485;node2.example.com:8485;node3.example.com:8485/mycluster</value>
</property>
/mycluster是目录。
6. 配置客户端容灾代理提供者
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
供hadoop客户端用来检测哪个NameNode是Active的。
7. 配置HA防护方法名集合(Optional)
QJM可以防止脑裂的发生,即不会存在两个Active NameNode写入edit logs。
可选配置sshfence或者给一个shell script。
8. 配置HDFS的文件系统
在core-site.xml中配置
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
9. 配置JNs本地存放数据的目录(edit logs)
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/path/to/journal/node/local/data</value>
</property>
一般设置在hadoop系统用户的家目录下。
HA的部署
1. 在JNs节点上启动JN进程
hadoop-daemon.sh start journalnode
2. 在磁盘上完成Active NameNode和Standby NameNode元数据的同步
(Ⅰ)如果正在构建新的hdfs集群,需要在一台NameNode上进行format工作。
(Ⅱ)若已经格式化文件系统或者在非HA的集群上启用HA功能,需要将现有NameNode的目录(~/hadoop/dfs/name)拷贝至另一台NameNode的相同目录下。在未格式化的NameNode主机上执行:
hdfs namenode -bootstrapStandby
该命令保证JNs有足够的edit来启动两个NameNode。在此之前要存在启动的NameNode。
(Ⅲ)如果正在将非HA的NameNode转换成HA,就执行命令
hdfs namenode -initializeShareEdits
上述命令将会将本地的NameNode编辑日志目录数据初始化到JNs中。要求~/hadoop/dfs/name目录不能锁定(没有in_use.lock文件)。
(Ⅴ)启动两个NameNode
hadoop-daemon.sh start namenode
(Ⅵ) 通过Web UI查看每个NameNode的状态
比如:
http://node01:50070
http://node02:50070
管理HA过程
1. 手动完成状态切换
hdfs haadmin -transitionToActive nn1 # 即NameNode ID