与联邦配置类似,HA配置向后兼容,并允许现有的单一NameNode配置无需更改即可工作。新的配置被设计成使得集群中的所有节点可以具有相同的配置,而不需要基于节点的类型将不同的配置文件部署到不同的机器。
与HDFS联合身份相似,HA群集重用名称服务标识来标识实际上可能由多个HA NameNode组成的单个HDFS实例。另外,一个名为NameNode ID的新抽象被添加到HA中。群集中每个不同的NameNode都有一个不同的NameNode ID来区分它。要支持所有NameNode的单个配置文件,相关的配置参数后缀名称服务ID以及NameNode ID。
要配置HA NameNode,您必须将多个配置选项添加到您的hdfs-site.xml配置文件。
设置这些配置的顺序并不重要,但是您为dfs.nameservices和dfs.ha.namenodes。[nameservice ID]选择的值将决定后面的那些键。因此,在设置其余的配置选项之前,您应该确定这些值。
<property>
<name>dfs.nameservicesname>
<value>myclustervalue>
property>
<property>
<name>dfs.ha.namenodes.myclustername>
<value>nn1,nn2value>
property>
注意:目前,每个名称服务最多只能配置两个NameNode。
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1name>
<value>machine1.example.com:8020value>
property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2name>
<value>machine2.example.com:8020value>
property>
注意:如果您愿意,您可以类似地配置“ servicerpc-address ”设置。
<property>
<name>dfs.namenode.http-address.mycluster.nn1name>
<value>machine1.example.com:50070value>
property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2name>
<value>machine2.example.com:50070value>
property>
注意:如果您启用了Hadoop的安全功能,则还应该为每个NameNode 设置类似的https地址。
例如,如果此群集的JournalNodes在机器“node1.example.com”,“node2.example.com”和“node3.example.com”上运行,并且名称服务ID是“mycluster”,则可以使用以下作为此设置的值(JournalNode的默认端口是8485):
<property>
<name>dfs.namenode.shared.edits.dirname>
<value>qjournal://node1.example.com:8485;node2.example.com:8485;node3.example.com:8485/myclustervalue>
property>
dfs.client.failover.proxy.provider.mycluster
org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
sshfence - SSH到活动NameNode并杀死进程
该sshfence选项SSHes到目标节点,并使用定影杀死进程监听服务的TCP端口上。为了使此隔离选项正常工作,它必须能够在不提供密码的情况下通过SSH连接到目标节点。因此,还必须配置dfs.ha.fencing.ssh.private-key-files选项,该选项是SSH私钥文件的以逗号分隔的列表。例如:
<property>
<name>dfs.ha.fencing.methodsname>
<value>sshfencevalue>
property>
<property>
<name>dfs.ha.fencing.ssh.private-key-filesname>
<value>/home/exampleuser/.ssh/id_rsavalue>
property>
或者,可以配置一个非标准的用户名或端口来执行SSH。也可以为SSH配置超时(以毫秒为单位),之后将认为此防护方法失败。它可以这样配置:
<property>
<name>dfs.ha.fencing.methodsname>
<value>sshfence([[username][:port]])value>
property>
<property>
<name>dfs.ha.fencing.ssh.connect-timeoutname>
<value>30000value>
property>
shell - 运行一个任意的shell命令来隔离Active NameNode
它可以这样配置:
dfs.ha.fencing.methods
shell(/path/to/my/script.sh arg1 arg2 ...)
这些环境变量也可以用作shell命令本身的替代。例如:
<property>
<name>dfs.ha.fencing.methodsname>
shell(/path/to/my/script.sh --nameservice=$target_nameserviceid $target_host:$target_port)
property>
如果shell命令返回退出码0,则确定防护成功。如果它返回任何其他退出代码,则防护不成功,并尝试列表中的下一个防护方法。
注意:此防护方法不会实现任何超时。如果超时是必要的,它们应该在shell脚本中实现(例如通过派生一个子shell来在几秒内终止它的父代)。
<property>
<name>fs.defaultFSname>
<value>hdfs://myclustervalue>
property>
<property>
<name>dfs.journalnode.edits.dirname>
<value>/path/to/journal/node/local/datavalue>
property>