提高hadoop的可靠性(下)

时间:2022-05-08
本文章向大家介绍提高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算法),为维护也带来了不小的难度。