提高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算法),为维护也带来了不小的难度。
- Java之线程———GUI线程(包含打字游戏和计时器俩个GUI实列)
- la----3695 City Game(最大子矩阵)
- poj------(3468)A Simple Problem with Integers(区间更新)
- hdu-------(1698)Just a Hook(线段树区间更新)
- NBitcoin:密码学第2部分
- gh-ost:在线DDL修改MySQL表结构工具
- poj-----(2828)Buy Tickets(线段树单点更新)
- javaSE之线程联合
- ASM 翻译系列第三十一弹:了解ASM文件的空间分配
- 备份重于一切:远离“Gitlab删库事件”,QBackup是你的最佳选择!
- FFMPEG指令
- Gitlab删库事件回顾,备份手段还停留在“原始社会”?
- ASM 翻译系列第三十二弹:自制数据抽取小工具
- WordPress集成SendCloud邮件代发,规避SMTP泄漏网站主机真实IP的风险
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法