Hadoop系大数据相关论文

【Hadoop】基于QJM的HDFS高可用系列二 - 部署

2017-04-25  本文已影响111人  mikeliuy

官方文档翻译,官方链接
翻译水平有限,且以学习为主,请谅解和提意见。
转载请注明出处!!!

接着上一篇发布的文章继续翻译。这次从部署章节开始。

部署

配置概述

类似联邦的配置,HA的配置向后兼容,且允许不改变现有的单NameNode配置集群的配置。如此设计新的配置,以致于在集群所有节点可以使用相同的配置,不需要基于此类型的节点部署不同的配置文件到不同的机器上。
像HDFS联邦机制一样,HA集群重用nameservice ID来标识一个单独的HDFS实例,该实例实际上由多个NameNode组成。另外,被称为NameNode ID新的抽象加入到HA。在集群中每个不同的NameNode都有一个不同的NameNode ID以示区别。对于所有的NameNode支持单一的配置文件,相关的配置参数使用nameservice ID为后缀,与NameNode ID等同。

配置细节

配置HA NameNode,必须增加几个配置项到hdfs-site.xml配置文件中。
对于你设置这些配置的顺序并不重要,但是对于dfs.nameservices和dfs.ha.namenodes选项所选择的值是重要的。[nameservice ID]将决定后面那些配置项的key。因此,设置剩下的配置项前,你将要决定这些值。

<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>

注意:目前,可以为每个nameservice配置最多两个NameNode。

<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>
<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>

注意:如果Hadoop使用安全特性,可以为每个NameNode配置HTTPS。

qjournal://*host1:port1*;*host2:port2*;*host3:port3*/*journalId*

对于这个nameservice,这个Journal ID是唯一的标识,允许一个单一的JournalNode集为联邦命名系统提供存储。虽然不是必须的,但是为journal ID重用nameservice ID是个好建议。
例如,对于这个集群JournalNode运行在“node1.example.com”,“node2.example.com”和“node3.example.com”机器上,且nameservice ID是“mycluster”,可以使用如下的值进行配置。JournalNode默认端口是8485。

<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>
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>

<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/exampleuser/.ssh/id_rsa</value>
</property>

可选,可以配置一个非标准带用户名和端口执行SSH,也可以配置超时,单位ms;对于SSH,fencing方法过时后,将被认为失败。配置如下:

<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence([[username][:port]])</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>

2)shell - 运行一个shell脚本,fence这个Active NameNode
Shell fencing方法运行一个任意的shell脚本,配置如下:

<property>
<name>dfs.ha.fencing.methods</name>
<value>shell(/path/to/my/script.sh arg1 arg2 ...)</value>
</property>

“(”和“)”之间的字符串直接传递到bash shell,中间不能包含任何关闭括号。
shell命令运行在一个包含所有当前Hadoop配置的环境里,使用配置键时使用'_'替换'.'。
另外,如下变量引用目标机器执行fencing:

变量名 说明
$target_host 被fencing的节点主机名
$target_port 被fencing的节点的IPC端口
$target_address 包含上述两个变量,形如:host:port
$target_nameserviceid 被fencing的NN的nameservice ID
$target_namenodeid 被fencing的NN的namenode ID

这些环境变量也可以使用shell命令本身的替换。例如:

<property>
<name>dfs.ha.fencing.methods</name>
<value>shell(/path/to/my/script.sh --nameservice=$target_nameserviceid $target_host:$target_port)</value>
</property>

如果shell命令返回退出码0,fencing被确定为成功。如果返回其它退出码,这个fencing没有成功,在列表中的下一个fencing将被执行。
注意:fencing方法没有实现任何超时。如果超时是必须的,应该在shell脚本中实现(例如通过子shell杀掉父进程的秒数)。

<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/path/to/journal/node/local/data</value>
</property>

部署细节

在准备好所有必须的配置项后,必须启动JournalNode守护进程。使用hadoop-daemon.sh start journalnode命令启动,并等待每个相关的机器上的进程启动完成。
一旦JournalNode已经启动完成,必须初始化同步两个NameNode在磁盘的元数据。

hdfs namenode -format
hdfs namenode -bootstrapStandby

运行该命令,确保JN(由dfs.namenode.shared.edits.dir作为配置)包含足够的编辑记录事务支持两个NameNode启动。

hdfs namenode -initializeSharedEdits

这个命令将从本地NameNode编辑记录目录初始化JN使用的编辑记录数据。
现在可以启动两个HA的NameNode,就像启动一般的NameNode。
可以分别通过配置的HTTP地址访问每个NameNode的web页面。将注意到配置地址显示NameNode的HA状态('active' 或'standby')。HA的NameNode初始状态任何时候都是Standby。

上一篇 下一篇

猜你喜欢

热点阅读