共计 11235 个字符,预计需要花费 29 分钟才能阅读完成。
在上一篇文章《Hadoop2.0 federation 的配置》(见 http://www.linuxidc.com/Linux/2014-05/101180.htm)中介绍了单独配置 federation,本文继续介绍同时配置 HA 和 federation。关于 zookeeper 的安装和配置,这里不做介绍,大家可以参考网上的资料。
1 准备
假定已经有一个 zookeeper 集群,包含 3 个 zookeeper 节点:
- zookeeper1
- zookeeper2
- zookeeper3
另外,还有 4 个 namenode 节点:
- namenode1
- namenode2
- namenode3
- namenode4
和 3 个 journalnode 节点:
- journalnode1
- journalnode2
- journalnode3
其他机器角色本文中不涉及的可以参考《hadoop2.0 的安装和基本配置》一文。
2 federation 和 HA 的结构
我们假定 hadoop 集群的 clusterid 是 hellokitty,有 2 个 namespace/name service,分别是“mycluster”和“yourcluster”,分别挂载在 viewfs 的“/my”和“/your”目录下。
“mycluster”和“yourcluster”都配置成 HA。其中“mycluster”的两个主备 namenode 节点分别是 namenode1 和 namenode2,NN_ID 分别是“nn1”和“nn2”;“yourcluster”的两个主备 namenode 节点分别是 namenode3 和 namenode4,NN_ID 分别是的“nn1”和“nn2”。
如下图所示:
3 federation 和 HA 的配置
federation 和 HA 的配置只涉及到 core-site.xml 和 hdfs-site.xml 两个配置文件,其他配置可以文件参考《Hadoop2.0 的安装和基本配置》一文(见 http://www.linuxidc.com/Linux/2014-05/101173.htm)。
为了简单起见,我们先不配置 HA 的自动切换,后面再把 HA 的自动切换配置上。
3.1 core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>viewfs:///</value>
</property>
<property>
<name>fs.viewfs.mounttable.default.link./my</name>
<value>hdfs://mycluster/</value>
</property>
<property>
<name>fs.viewfs.mounttable.default.link./your</name>
<value>hdfs://yourcluster/</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/tmp/hadoop2.0</value>
</property>
</configuration>
3.2 hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/dfs/data</value>
</property>
<property>
<name>dfs.datanode.edit.dir</name>
<value>/home/dfs/edit</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
<property>
<name>dfs.nameservices</name>
<value>mycluster,yourcluster</value>
</property>
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.ha.namenodes.yourcluster</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>namenode1:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>namenode2:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.yourcluster.nn1</name>
<value>namenode1:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.yourcluster.nn2</name>
<value>namenode2:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>namenode1:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>namenode2:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.yourcluster.nn1</name>
<value>namenode1:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.yourcluster.nn2</name>
<value>namenode2:50070</value>
</property>
<!–dfs.namenode.shared.edits.dir 的配置在 namenode1 和 namenode2 上用以下这个 –>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://journalnode1:8485;journalnode2:8485;journalnode3:8485/mycluster</value>
</property>
<!–dfs.namenode.shared.edits.dir 的配置在 namenode3 和 namenode4 上用以下这个
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://journalnode1:8485;journalnode2:8485;journalnode3:8485/yourcluster</value>
</property>
–>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/dfs/journal</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.client.failover.proxy.provider.yourcluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>shell(/bin/true)</value>
</property>
</configuration>
- dfs.namenode.shared.edits.dir
这个参数要注意,在两组 HA 中的值是不一样的,即在“mycluster”(namenode1 和 namenode2) 和是“yourcluster”(namenode3 和 namenode4) 中是不同。
更多详情见请继续阅读下一页的精彩内容 :http://www.linuxidc.com/Linux/2014-05/101181p2.htm
4 启动
4.1 先启动 journalnode,在 journalnode 节点上执行以下命令
$Hadoop_HOME/sbin/hadoop-daemon.sh start journalnode
4.2 在 namenode1 和 namenode3 上执行格式化命令并启动 namenode
$HADOOP_HOME/bin/hdfs namenode -format –clusterId hellokitty
$HADOOP_HOME/sbin/hadoop-daemon.sh start namenode
4.3 在 namenode2 和 namenode4 上执行 bootstrapStandby 命令并启动 namenode
$HADOOP_HOME/sbin/hadoop-daemon.sh start namenode -bootstrapStandby
$HADOOP_HOME/sbin/hadoop-daemon.sh start namenode
这时 namenode1,namenode2,namenode3,namenode4 四个 namenode 都是“standby”状态。
4.4 在 namenode1 和 namenode3 执行以下命令,切换成“active”状态
$HADOOP_HOME/bin/hdfs haadmin -transitionToActive nn1
4.5 在 datanode 节点上启动 datanode
$HADOOP_HOME/sbin/hadoop-daemon.sh start datanode
5 检查和测试
查看 namenode1,namenode2,namenode3,namenode4 的 HDFS 的监控页面,都能看到所有的 datanode
http://namenode1:50070/dfshealth.jsp
http://namenode2:50070/dfshealth.jsp
http://namenode3:50070/dfshealth.jsp
http://namenode4:50070/dfshealth.jsp
其中 namenode1 和 namenode3 为“active”状态,namenode2 和 namenode4 为“standby”状态。
可以参考《Hadoop2.0 federation 的配置》(见 http://www.linuxidc.com/Linux/2014-05/101180.htm)和《Hadoop2.0 QJM 方式的 HA 的配置》(见 http://www.linuxidc.com/Linux/2014-05/101175.htm)运行 HDFS 命令测试 federation 和 HA 的特性是否生效。
6 配置 HA 的主备自动切换
我们接着通过配置 zookeeper 把 HA 主备自动切换的特性加上。
6.1 在 core-site.xml 加上以下参数
<property>
<name>ha.zookeeper.quorum</name>
<value>zookeeper1:2181,zookeeper2:2181,zookeeper3:2181</value>
</property>
6.2 在 hdfs-site.xml 加上以下参数
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
6.3 在 zookeeper 中初始化
$HADOOP_HOME/bin/hdfs zkfc -formatZK
运行这个命令后,会在 zookeeper 上创建一个 /hadoop-ha/mycluster/ 的 znode,用来存放 automatic failover 的数据。
6.4 启动 zkfc daemon 进程
$HADOOP_HOME/sbin/hadoop-daemon.sh start zkfc
在 namenode1,namenode2,namenode3,namenode4 上都启动 zkfc daemon 进程。
这样 2 组 HA 的主备自动切换就配置好了,可以参考《hadoop2.0 HA 的主备自动切换》(见 http://www.linuxidc.com/Linux/2014-05/101176.htm)测试是否生效。
7 实战 tips
federation 并不能解决 namenode 的单点问题,因此在实践中需要给 federation 的每个 namenode 都配置成 HA,才能解决 namenode 的单点问题。
参考资料:
http://hadoop.apache.org/docs/r2.2.0/hadoop-yarn/hadoop-yarn-site/HDFSHighAvailabilityWithQJM.html
http://hadoop.apache.org/docs/r2.2.0/hadoop-project-dist/hadoop-hdfs/Federation.html
更多 Hadoop 相关信息见 Hadoop 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=13
在上一篇文章《Hadoop2.0 federation 的配置》(见 http://www.linuxidc.com/Linux/2014-05/101180.htm)中介绍了单独配置 federation,本文继续介绍同时配置 HA 和 federation。关于 zookeeper 的安装和配置,这里不做介绍,大家可以参考网上的资料。
1 准备
假定已经有一个 zookeeper 集群,包含 3 个 zookeeper 节点:
- zookeeper1
- zookeeper2
- zookeeper3
另外,还有 4 个 namenode 节点:
- namenode1
- namenode2
- namenode3
- namenode4
和 3 个 journalnode 节点:
- journalnode1
- journalnode2
- journalnode3
其他机器角色本文中不涉及的可以参考《hadoop2.0 的安装和基本配置》一文。
2 federation 和 HA 的结构
我们假定 hadoop 集群的 clusterid 是 hellokitty,有 2 个 namespace/name service,分别是“mycluster”和“yourcluster”,分别挂载在 viewfs 的“/my”和“/your”目录下。
“mycluster”和“yourcluster”都配置成 HA。其中“mycluster”的两个主备 namenode 节点分别是 namenode1 和 namenode2,NN_ID 分别是“nn1”和“nn2”;“yourcluster”的两个主备 namenode 节点分别是 namenode3 和 namenode4,NN_ID 分别是的“nn1”和“nn2”。
如下图所示:
3 federation 和 HA 的配置
federation 和 HA 的配置只涉及到 core-site.xml 和 hdfs-site.xml 两个配置文件,其他配置可以文件参考《Hadoop2.0 的安装和基本配置》一文(见 http://www.linuxidc.com/Linux/2014-05/101173.htm)。
为了简单起见,我们先不配置 HA 的自动切换,后面再把 HA 的自动切换配置上。
3.1 core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>viewfs:///</value>
</property>
<property>
<name>fs.viewfs.mounttable.default.link./my</name>
<value>hdfs://mycluster/</value>
</property>
<property>
<name>fs.viewfs.mounttable.default.link./your</name>
<value>hdfs://yourcluster/</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/tmp/hadoop2.0</value>
</property>
</configuration>
3.2 hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/dfs/data</value>
</property>
<property>
<name>dfs.datanode.edit.dir</name>
<value>/home/dfs/edit</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
<property>
<name>dfs.nameservices</name>
<value>mycluster,yourcluster</value>
</property>
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.ha.namenodes.yourcluster</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>namenode1:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>namenode2:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.yourcluster.nn1</name>
<value>namenode1:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.yourcluster.nn2</name>
<value>namenode2:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>namenode1:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>namenode2:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.yourcluster.nn1</name>
<value>namenode1:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.yourcluster.nn2</name>
<value>namenode2:50070</value>
</property>
<!–dfs.namenode.shared.edits.dir 的配置在 namenode1 和 namenode2 上用以下这个 –>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://journalnode1:8485;journalnode2:8485;journalnode3:8485/mycluster</value>
</property>
<!–dfs.namenode.shared.edits.dir 的配置在 namenode3 和 namenode4 上用以下这个
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://journalnode1:8485;journalnode2:8485;journalnode3:8485/yourcluster</value>
</property>
–>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/dfs/journal</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.client.failover.proxy.provider.yourcluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>shell(/bin/true)</value>
</property>
</configuration>
- dfs.namenode.shared.edits.dir
这个参数要注意,在两组 HA 中的值是不一样的,即在“mycluster”(namenode1 和 namenode2) 和是“yourcluster”(namenode3 和 namenode4) 中是不同。
更多详情见请继续阅读下一页的精彩内容 :http://www.linuxidc.com/Linux/2014-05/101181p2.htm