提高hadoop的可靠性(下)

在Hadoop集群中,Namenode的可用性直接影响了Hadoop整个集群的可用性,目前有很多可选方案,基本上以NFS+zookeeper实现,但是仍然存在单点,因此官方引入了QJM解决方案。这里以Hadoop2.6.3为例,来看下如何解决数据单点问题。

首先先来了解以下QJM实现的原理,NameNode节点存储数据包括edits_* 的事务文件以及fsimage_*的内存镜像,同步只需要事务文件,因此QJM采用JournalNode来同步记录主NameNode的事务,并同步到备Namenode,为了标记主备Namnode状态和自动切换,引入zookeeper集群来记录状态,并通过 ZKFailoverController做主备选举,利用Fence功能来保护意外存活的节点,防止脑裂发生。更详细的信息或NFS方式高可用可以参考官方文档:

http://hadoop.apache.org/docs/r2.6.3/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html

这里以test1-test4四台测试机为例列举关键配置文件

hdfs-site.xml

#### 将nameservice命名为mycluster ####

<property>
  <name>dfs.nameservices</name>
  <value>mycluster</value>
  <description>the logical name for this new nameservice</description>
</property>
<property>

#### 为两个节点命名一个唯一标识,目前只能支持两节点 ####

  <name>dfs.ha.namenodes.mycluster</name>
  <value>nn1,nn2</value>
  <description>unique identifiers for each NameNode in the nameservice</description>
</property>

#### 每节点对应的主机名和端口,注意要将主机名写入每个节点的/etc/hosts ####

<property>
  <name>dfs.namenode.rpc-address.mycluster.nn1</name>
  <value>test1:8020</value>
  <description>the fully-qualified RPC address for each NameNode to listen on</description>
</property>
<property>
  <name>dfs.namenode.rpc-address.mycluster.nn2</name>
  <value>test2:8020</value>
  <description>the fully-qualified RPC address for each NameNode to listen on</description>
</property>
<property>
  <name>dfs.namenode.servicerpc-address.mycluster.nn1</name>
  <value>test1:53310</value>
</property>
<property>
  <name>dfs.namenode.servicerpc-address.mycluster.nn2</name>
  <value>test2:53310</value>
</property>
<property>
  <name>dfs.namenode.http-address.mycluster.nn1</name>
  <value>test1:50070</value>
  <description>the fully-qualified HTTP address for each NameNode to listen on</description>
</property>
<property>
  <name>dfs.namenode.http-address.mycluster.nn2</name>
  <value>test2:50070</value>
  <description>the fully-qualified HTTP address for each NameNode to listen on</description>
</property>
<property>
  <name>dfs.namenode.shared.edits.dir</name>
  <value>qjournal://test1:8485;test2:8485;test3:8485/mycluster</value>
  <description> the URI which identifies the group of JNs where the NameNodes will write/read edits</description>
</property>
<property>
  <name>dfs.client.failover.proxy.provider.mycluster</name>
  <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
#### 发起fence方式,和ssh的必要参数 ####
<property>
  <name>dfs.ha.fencing.methods</name>
  <value>sshfence</value>
</property>
<property>
  <name>dfs.ha.fencing.ssh.private-key-files</name>
  <value>/home/hadoop/.ssh/id_rsa</value>
</property>
<property>
  <name>dfs.ha.fencing.methods</name>
  <value>date</value>
</property>
#### 支持自动故障转移 ####
<property>
   <name>dfs.ha.automatic-failover.enabled</name>
   <value>true</value>
</property>
#### 发起fence时执行的命令,()里面的是shell命令
<property>
  <name>dfs.ha.fencing.methods</name>
  <value>shell(/bin/true)</value>
</property>
<property>
   <name>ha.zookeeper.quorum</name>
   <value>test1:2181,test2:2181,test3:2181</value>
 </property>
core-site.xml
<property>
  <name>fs.defaultFS</name>
  <value>hdfs://mycluster</value>
</property>
<property>
  <name>dfs.journalnode.edits.dir</name>
  <value>/data/journal</value>
</property>

配置完成基本的Hadoop后,为切换做准备,启动zookeeper

cd /home/hadoop/zk/bin ; ./zkServer.sh start

启动journalnode进行edit事务日志的同步

$ hadoop-daemon.sh start journalnode

对hdfs进行格式化并进行同步测试

$ hdfs namenode -format

初始化zookeeper,写入高可用信息

$ hdfs zkfc -formatZK

启动集群,即可

$ start-all.sh

总体来说,QJM方式的Hadoop Namenode 高可用是比较完整的解决方案,包括Fence Quorum 的引入,但是在维护上面也增加了很高的成本。引入了zookeeper集群和journal集群(著名的Paxos算法),为维护也带来了不小的难度。

原文发布于微信公众号 - 奇点(qddata)

原文发表时间:2016-01-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏about云

Hadoop HTTP web-consoles认证机制

问题导读 1.如何配置 Hadoop HTTP web-consoles 所需要的用户身份验证? 2.哪个配置文件可以配置 Hadoop HTTP认证? 3....

3386
来自专栏别先生

一脸懵逼学习Hadoop分布式集群HA模式部署(七台机器跑集群)

1)集群规划: 主机名          IP      安装的软件                      运行的进程 master    192.168...

5489
来自专栏Hadoop实操

如何在CDH中为Kafka设置流量配额

31412
来自专栏计算机视觉与深度学习基础

hadoop配置文件详解、安装及相关操作

一、      Hadoop伪分布配置            1. 在conf/hadoop-env.sh文件中增加:export JAVA_HOME=/hom...

2615
来自专栏CSDN技术头条

Hadoop大数据平台运维工程师须掌握的基本命令集分享

本博文收集和整理了在日常维护hadoop集群时运维工程师需要掌握的最基本的hadoop管理与维护的相关命令,在此分享出来供大家参考学习~博主也是刚刚接触hado...

2569
来自专栏Spark学习技巧

Spark的调度系统

一,简介 Spark调度机制可以理解为两个层面的调度。首先,是Spark Application调度。也就是Spark应用程序在集群运行的调度,应用程序包括Dr...

2558
来自专栏祝威廉

使用Spark SQL构建批处理程序

在批处理模式下,所有的数据源和输出都各自有一个固定的模块(使用了Spark的Datasource API),然后对模块做配置即可,无需使用不同的模块。

1093
来自专栏熊二哥

Hadoop快速入门

传说中的Hadoop,我终于来对着你唱"征服"了,好可爱的小象,!J 总的来说,hadoop的思路比较简单(map-reduce),就是将任务分开进行,最后汇总...

9206
来自专栏IT技术精选文摘

Hadoop完全分布式搭建

6472
来自专栏编程坑太多

跟我一起学docker(16)--单节点mesos集群

1703

扫码关注云+社区

领取腾讯云代金券