Hadoop集群安全性:Hadoop中Namenode单点故障的解决方案及详介AvatarNode
2019独角兽企业重金招聘Python工程师标准>>>
正如大家所知,NameNode在Hadoop系统中存在单点故障问题,这个对于标榜高可用性的Hadoop来说一直是个软肋。本文讨论一下为了解决这个问题而存在的几个solution。
1. Secondary NameNode
原理:Secondary NN会定期的从NN中读取editlog,与自己存储的Image进行合并形成新的metadata image
优点:Hadoop较早的版本都自带,配置简单,基本不需要额外资源(可以与datanode共享机器)
缺点:恢复时间慢,会有部分数据丢失
2. Backup NameNode
原理:backup NN实时得到editlog,当NN宕掉后,手动切换到Backup NN;
优点:从hadoop0.21开始提供这种方案,不会有数据的丢失
缺点:因为需要从DataNode中得到Block的location信息,在切换到Backup NN的时候比较慢(依赖于数据量)
3. Avatar NameNode
原理:这是Facebook提供的一种HA方案,将client访问hadoop的editlog放在NFS中,Standby NN能够实时拿到editlog;DataNode需要同时与Active NN和Standby NN report block信息;
优点:信息不会丢失,恢复快(秒级)
缺点:Facebook基于Hadoop0.2开发的,部署起来稍微麻烦;需要额外的机器资源,NFS成为又一个单点(不过故障率低)
4. Hadoop2.0直接支持StandBy NN,借鉴Facebook的Avatar,然后做了点改进
优点:信息不会丢失,恢复快(秒级),部署简单
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
详细介绍Hadoop NameNode单点问题解决方案之一 AvatarNode
需求:
实现namenode元数据的备份,解决namenode单点宕机导致集群不可用的问题。
方案描述:
当namenode所在服务器宕机的时候,我们可以利用namenode备份的元数据迅速重构新的namenode来投入使用。
1. Hadoop 本身提供了可利用secondarynamenode的备份数据来恢复namenode的元数据的方案,但因为checkpoint(在每次 checkpoint的时候secondarynamenode才会合并并同步namenode的数据)的问题,secondarynamenode的备 份数据并不能时刻保持与namenode同步,也就是说在namenode宕机的时候secondarynamenode可能会丢失一段时间的数据,这段 时间取决于checkpoint的周期。我们可以减小checkpoint的周期来减少数据的丢失量,但由于每次checkpoint很耗性能,而且这种 方案也不能从根本上解决数据丢失的问题。所以如果需求上不允许这种数据的丢失,这种方案可直接不予考虑。
2. Hadoop 提供的另一种方案就是NFS,一种即时备份namenode元数据的方案,设置多个data目录(包括NFS目录),让namenode在持 久化元数据的时候同时写入多个目录,这种方案较第一种方案的优势是能避免数据的丢失(这里我们暂时不讨论NFS本身会丢失数据的可能性,毕竟这种几率很小 很小)。既然可以解决数据丢失的问题,说明这套方案在原理上是可行的
下载源码
https://github.com/facebook/hadoop-20
部署环境
机器4台
hadoop1-192.168.64.41 AvatarNode(primary)
hadoop2-192.168.64.42 AvataDataNode
hadoop3-192.168.64.43 AvataDataNode
hadoop4- 192.168.64.67 AvatarNode(standby)
相关资源及描述
以下是Avatar方案部署相关的简单介绍。
1.首先关于Avatar方案对于Hadoop的备份是对Dfs的的单点备份,并不包括Mapred,因为Hadoop本身就不存在处理jobtracker单点故障的机制。
2.AvatarNode继承自Namenode,而并非对Namenode的修改,AvatarDataNode同样亦如此。故Avatar的启动机制是独立于Hadoop本身的启动机制。
3.在Avatar方案中,SecondaryNamenode的职责已包括在Standby节点中,故不需要再独立启动一个SecondaryNamenode。
4.AvatarNode必须有NFS的支持,用以实现两个节点间事务日志(editlog)的共享。
5.FB提供的Avatar源码中暂时并不能实现Primary和Standby之间的自动切换,可以借助于Zookeeper的lease机制来实现自动切换。
6.Primary和Standby之间的切换只包括从Standby切换到Primary,并不支持从Primary状态切换到Standby状态。
7.AvatarDataNode并不使用VIP和AvatarNode通信,而是直接与Primary及Standby通信,故需要使用VIP漂移方案来屏蔽两个节点间切换过程中的IP变换问题。有关与Zookeeper的整合,官方称将在之后的版本发布。
关于AvatarNode更详细的介绍,请参考http://blog.csdn.net/rzhzhz/article/details/7235789,
三、编译
1. 首先修改hadoop根目录下build.xml,注释掉996行和1000行。如下:
<targetname="forrest.check"unless="forrest.home"depends="java5.check">
<!--fail message="'forrest.home' is not defined. Pleasepass-Dforrest.home=<base of Apache Forrest installation> to Antonthe command-line." /-->
</target>
<target name="java5.check" unless="java5.home">
<!--fail message="'java5.home' is not defined. Forrest requires Java 5. Please pass -Djava5.home=<base of Java5 distribution> to Ant onthe command-line." /-->
</target>
2. 在根目录下输入ant jar(对于编译package可以参考build.xml的代码)编译hadoop,编译后的jar包会在build目录下(hadoop- 0.20.3-dev-core.jar), 拷贝该jar包到hadoop根目录下替换到原有的jar (啰嗦一句,hadoop启动时会先加载build目录下的class,所以当通过替换class修改jar包时请先把build目录暂时移除掉) 。
3. 进入src/contrib/highavailability目录下编译Avatar,编译后的jar包 会在build/contrib/highavailability目录下(hadoop-${version}- highavailability.jar),拷贝该jar包到lib目录下。
4. 把2,3步中编译好的jar包分发到集群中所有机器的相应目录。
四、配置
1. 配置hdfs-site.xml
<?xmlversion="1.0"?>
<?xml-stylesheettype="text/xsl"href="configuration.xsl"?>
<!-- Put site-specificproperty overrides in thisfile. -->
<configuration>
<property>
<name>dfs.name.dir</name>
<value>/data/hadoop/hdfs/name</value>
<description>Determineswhereon the local filesystem the DFS name node shouldstore the name table. Ifthis is a comma-delimited list ofdirectories then the name tableis replicated in all of thedirectories, for redundancy
</description>
</property>
<property>
<name>dfs.data.dir</name>
<value>/data/hadoop/facebook_hadoop_data/hdfs/data</value>
</property>
<property>
<name>dfs.datanode.address</name>
<value>0.0.0.0:50011</value>
<description>默认为50010, 是datanode的监听端口</description>
</property>
<property>
<name>dfs.datanode.http.address</name>
<value>0.0.0.0:50076</value>
<description>默认为50075,为datanode的http server端口</description>
</property>
<property>
<name>dfs.datanode.ipc.address</name>
<value>0.0.0.0:50021</value>
<description>默认为50020, 为datanode的ipc server端口</description>
</property>
<property>
<name>dfs.http.address0</name>
<value>192.168.64.41:50070</value>
</property>
<property>
<name>dfs.http.address1</name>
<value>192.168.64.67:50070 </value>
</property>
<property>
<name>dfs.name.dir.shared0</name>
<value>/data/hadoop/share/shared0</value>
</property>
<property>
<name>dfs.name.dir.shared1</name>
<value>/data/hadoop/share/shared1</value>
</property>
<property>
<name>dfs.name.edits.dir.shared0</name>
<value>/data/hadoop/share/shared0</value>
</property>
<property>
<name>dfs.name.edits.dir.shared1</name>
<value>/data/hadoop/share/shared1</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
<description>
Defaultblock replication. The actual number of replicationscan bespecified when the file is created. The default isused ifreplicationis not specified in create time
</description>
</property>
</configuration>
参数说明:
1) dfs.name.dir.shared0
AvatarNode(Primary)元数据存储目录,注意不能和dfs.name.dir目录相同
2) dfs.name.dir.shared1
AvatarNode(Standby)元数据存储目录,注意不能和dfs.name.dir目录相同
3) dfs.name.edits.dir.shared0
AvatarNode(Primary) edits文件存储目录,默认与 dfs.name.dir.shared0一致
4) dfs.name.edits.dir.shared1
AvatarNode(Standby) edits文件存储目录,默认与 dfs.name.dir.shared1一致
5) dfs.http.address0
AvatarNode(Primary) HTTP的监控地址
6) dfs.http.address1
AvatarNode(Standby) HTTP的监控地址
7) dfs.namenode.dn-address0/dfs.namenode.dn-address1
虽然在Avatar源码中有所涉及,但暂时并未用到
2. 配置core-site.xml
<?xmlversion="1.0"?>
<?xml-stylesheettype="text/xsl"href="configuration.xsl"?>
<!-- Putsite-specificproperty overrides in this file. -->
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/tmp</value>
<description>A baseforother temporary directories.
</description>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://192.168.64.41:9600</value>
<description>The name ofthedefault file system. Eitherthe literal string"local" or a host:port for DFS.
</description>
</property>
<property>
<name>fs.default.name0</name>
<value>hdfs://192.168.64.41:9600</value>
<description>The name ofthedefault file system. Eitherthe literal string"local" or a host:port for DFS.
</description>
</property>
<property>
<name>fs.default.name1</name>
<value>hdfs://192.168.64.67:9600</value>
<description>The name ofthedefault file system. Eitherthe literal string"local" or a host:port for DFS.
</description>
</property>
</configuration>
参数说明:
1) fs.default.name
当前AvatarNode IP地址和端口号,即Primary和Standby的配置为各自的IP地址和端口号。
2) fs.default.name0
AvatarNode(Primary) IP地址和端口号
3) fs.default.name1
AvatarNode(Standby) IP地址和端口号
3. 因为不涉及到mapred,故mapred-site.xml不用作修改,为原有集群配置即可。
4. 分发修改后的配置文件到集群节点并在Primary和Standby节点上建立好配置文件中相应目录。
5. 建立NFS,实现Primary与Standby shared0目录的数据共享。有关NFS的配置请参考http://blog.csdn.net/rzhzhz/article/details/7056732
6. 格式化Primary与Standby,这里可以采用hadoop本身的格式化命令,也可以采用AvatarNode的格式化命令 (bin/hadooporg.apache.hadoop.hdfs.AvatarShell -format),但此时shared1目录不能为空,此处有点多余。建议采用hadoop本身的格式化命令在Primary上格式化后,并且把name 目录下的文件复制到shared0目录下。然后再在Standby上复制shared0目录下的文件到shared1目录下。
五、启动
1. 由于不涉及jobtracker的单点,在这里我们只启动hdfs相关线程。Primary,Standby两个namenode(此处Standby包括SecondaryNamenode的职责)和3个AvatarDataNode数据节点。
2. 在Primary节点hadoop根目录下启动AvatarNode(Primary)
bin/hadooporg.apache.hadoop.hdfs.server.namenode.AvatarNode–zero
3. 在Standby节点hadoop根目录下启动AvatarNode(Standby)
bin/hadooporg.apache.hadoop.hdfs.server.namenode.AvatarNode-one–standby
4. 依次在数据节点hadoop根目录下启动AvatarDataNode
bin/hadooporg.apache.hadoop.hdfs.server.datanode.AvatarDataNode
5. 其他相关命令
bin/hadoop org.apache.hadoop.hdfs.server.namenode.AvatarNode,后面可 选参数有
[-standby] | [-sync] |[-zero] | [-one] | [-format] | [-upgrade] | [-rollback] |[-finalize] | [-importCheckpoint]
##查看当前AvatarNode的状态
1) bin/hadoop org.apache.hadoop.hdfs.AvatarShell –showAvatar
##primary 把当前Standby节点升级Primary节点
2) bin/hadooporg.apache.hadoop.hdfs.AvatarShell -setAvatar
3) bin/hadooporg.apache.hadoop.hdfs.AvatarShell -setAvatar standby
集群测试
1. 访问集群的web页
(Primary)http://hadoop1-virtual-machine:50070
(Standby)http://hadoop5-virtual-machine:50070
可见所有的AvatarDataNode都已注册到两个namenode,Primary处于正常状态,而Standby处于Safemode状态,只可读不可写。可通过AvatarShell命令查看当前AvatarNode的状态(Primary或Standby)。
2. 存储相关数据到集群,集群正常工作。
3. Kill掉Primary节点的AvatartNode线程,在Standby把当前升级为Prirmary,数据并未丢失,集群正常工作(此时 web端不能正常访问文件系统,通过shell命令可查看集群数据)。但由于Avatar有转换限制,只能由Standby转换成Primary,故一次 故障后,由Standby上升为Primary的节点并不能重新降级为Standby,所以不能实现像Master/Slave那种自由切换。
转载于:https://my.oschina.net/u/2377453/blog/464283
Hadoop集群安全性:Hadoop中Namenode单点故障的解决方案及详介AvatarNode相关推荐
- Hadoop中Namenode单点故障的解决方案
Hadoop中Namenode单点故障的解决方案 需求: 实现namenode元数据的备份,解决namenode单点宕机导致集群不可用的问题. 方案描述: 当namenode所在服务器宕机的时候,我们 ...
- 基于阿里云服务器搭建hadoop集群:HDFS的namenode WEB访问9870端口打不开解决方法
基于阿里云服务器搭建hadoop集群:HDFS的namenode WEB访问9870端口打不开解决方法 以下是基于我所面临问题的解决办法. 1.在本地的c:windows/system32/dirve ...
- Hadoop集群搭建过程中ssh免密码登录(二)
一.为什么设置ssh免密码登录 在集群中,Hadoop控制脚本依赖SSH来执行针对整个集群的操作.例如,某个脚本能够终止并重启集群中的所有守护进程.所以,需要安装SSH,但是,SSH远程登陆的时候,需 ...
- Hadoop集群搭 Hadoop分布式文件系统架构和设计
Hadoop集群搭建 先决条件 确保在你集群中的每个节点上都安装了所有必需软件. 获取Hadoop软件包. 安装 安装Hadoop集群通常要将安装软件解压到集群内的所有机器上. 通常,集群里的一台机器 ...
- hadoop集群搭建过程中不适用hostname发现slave,而是通过ip
需求 搭建hadoop集群时,默认使用hostname发现集群 如果不配置hostname的话,报错日志: Unresolved datanode registration: hostname can ...
- linux hadoop集群搭建,hadoop集群搭建
hadoop集群搭建步骤 实验介绍 下面将要在三台linux虚拟机上搭建hadoop集群. 知识点 linux基本命令 集群安装 完成实验需要以下相关知识 解压命令 tar -zxvf XX.tar. ...
- Hadoop集群(四) Hadoop升级
Hadoop前面安装的集群是2.6版本,现在升级到2.7版本. 注意,这个集群上有运行Hbase,所以,升级前后,需要启停Hbase. 更多安装步骤,请参考: Hadoop集群(一) Zookeepe ...
- Hadoop中Namenode单点故障的解决方案及详细介绍
正如大家所知,NameNode在Hadoop系统中存在单点故障问题,这个对于标榜高可用性的Hadoop来说一直是个软肋.本文讨论一下为了解决这个问题而存在的几个solution. 1. Seconda ...
- Hadoop详解(五)——ZooKeeper详解,ZooKeeper伪分布搭建和集群搭建,Hadoop集群搭建,sqoop工具的使用
ZooKeeper简介 什么是ZooKeeper? ZooKeeper是Google的Chubby一个开源的实现,是Hadoop分布式协调服务. 它包含了一个简单的原语集,分布式应用程序可以基于它实现 ...
最新文章
- 最新!全球学术排名出炉:18所中国大学位居世界100强
- CentOS6 操作系统安装方法
- 【教程】EditPlus+MinGW搭建简易的C/C++开发环境
- 成功解决\h5py\__init__.py:34: FutureWarning: Conversion of the second argument of issubdtype from `float
- C语言十六进制数转八进制(十进制作为中介)(附完整源码)
- Asp.net 面向接口可扩展框架之核心容器
- php使用accdb,php如何连接access2007的accdb格式数据库文件?
- org.activiti.engine.ActivitiOptimisticLockingException updated by another transaction concurrently
- 复制含有随机指针节点的链表~哈希表的使用~(⌒▽⌒)
- 【算法】迪杰斯特拉算法 最短路径算法
- 华中科技大学计算机专业培养计划,2021年华中科技大学计算机科学与技术专业本科人才培养方案.doc...
- 7 练习1 -基础练习
- LAFEAT: Piercing Through Adversarial Defenses with Latent Features论文解读
- Linux C/C++之TCP / UDP通信
- fgo服务器维护补偿,FGO终章活动服务器崩溃 补偿圣晶石24颗
- 泰勒公式和海森矩阵(Hessian-matrix)
- 生产者消费者问题实验java,java实现:《操作系统实验一》:模拟管程解决解决生产者-消费者...
- 【工业机器人】机器人产业的前途取决于人工智能关键技术的发展
- 生日在java中怎么写_怎样用java做个生日提醒?如果同一天有多个人过生日怎么做?...
- nginx 监听多个端口 80和81