Google在2004年创造了MapReduce,MapReduce系统获得成功的原因之一是它为编写需要大规模并行处理的代码提供了简单的编程模式。MapReduce集群可包括数以千计的并行操作的计算机。同时MapReduce允许程序员在如此庞大的集群中快速的转换数据并执行数据。它受到了Lisp的函数编程特性和其他函数式语言的启发。MapReduce和云计算非常相配。MapReduce的关键特点是它能够对开发人员隐藏操作并行语义 — 并行编程的具体工作方式。

HDFS(Hadoop Distributed Filesystem)是专为MapReduce框架而下大规模分布式数据处理而设计的,HDFS可将大数据集(TB级)存储为单个文件,而大多文件系统并不具备这样的能力。(编者注:NTFS5 Max Files on Volume:264 bytes (16 ExaBytes) minus 1KB,1EB = 1,000,000 TB)。这也是HDFS风靡全球的重要原因。

目前Facebook Hadoop集群内的HDFS物理磁盘空间承载超过100PB的数据(分布在不同数据中心的100多个集群)。由于HDFS存储着Hadoop应用需要处理的数据,因此优化HDFS成为Facebook为用户提供高效、可靠服务至关重要的因素。

HDFS Namenode是如何工作的?

HDFS客户端通过被称之为Namenode单服务器节点执行文件系统原数据操作,同时DataNode会与其他DataNode进行通信并复制数据块以实现冗余,这样单一的DataNode损坏不会导致集群的数据丢失。

但NameNode出现故障的损失确是无法容忍的。NameNode主要职责是跟踪文件如何被分割成文件块、文件块又被哪些节点存储,以及分布式文件系统的整体运行状态是否正常等。但如果NameNode节点停止运行的话将会导致数据节点无法通信,客户端无法读取和写入数据到HDFS,实际上这也将导致整个系统停止工作。

The HDFS Namenode is a single point of failure (SPOF)

Facebook也深知“Namenode-as-SPOF”所带来问题的严重性,所以Facebook希望建立一套系统已破除“Namenode-as-SPOF”带来的隐患。但在了解这套系统之前,首先来看一下Facebook在使用和部署HDFS都遇到了哪些问题。

Facebook数据仓库的使用情况

在Facebook的数据仓库中部署着最大的HDFS集群,数据仓库的使用情况是传统的Hadoop MapReduce工作负载——在大型集群中一小部分运行MapReduce批处理作业

因为集群非常庞大,客户端和众多DataNode节点与NameNode节点传输海量的原数据,这导致NameNode的负载非常沉重。而来自CPU、内存、磁盘和网络带来的压力也使得数据仓库集群中NameNode高负载状况屡见不鲜。在使用过程中Facebook发现其数据仓库中由于HDFS引发的故障占总故障率的41%。

HDFS NameNode是HDFS中的重要组成部分,同时也是整个数据仓库中的重要组成部分。虽然高可用的NameNode只可以预防数据仓库10%的计划外停机,不过消除NameNode对于SPOF来说可谓是重大的胜利,因为这使得Facebook可执行预订的硬件和软件回复。事实上,Facebook预计如果解决NameNode可消除集群50%的计划停机时间。

那么高可用性NameNode是什么样子的?它将如何工作?让我们来看一下高度可用性NameNode的图表。

在此结构中,客户端可与Primary NameNode与Standby NameNode通信,同样众多DataNode

也具备给Primary NameNode与Standby NameNode发送block reports的能力。实质上Facebook所研发的AvatarNode就是具备高可用NameNode的解决方案。

Avatarnode:具备NameNode故障转移的解决方案

为了解决单NameNode节点的设计缺陷,大约在两年前Facebook开始在内部使用AvatarNode工作。

同时AvatarNode提供了高可用性的NameNode以及热故障切换和回滚功能,目前Facebook已经将AvatarNode贡献到了开源社区。经过无数次的测试和Bug修复,AvatarNode目前已在Facebook最大的Hadoop数据仓库中稳定运行。在这里很大程度上要感谢Facebook的工程师Dmytro Molkov

当发生故障时,AvatarNode的两个高可用NameNode节点可手动故障转移。AvatarNode将现有的NameNode代码打包并放置在Zookeeper层。

AvatarNode的基本概念如下:

1.具备Primary NameNode与Standby NameNode

2.当前Master主机名保存在ZooKeeper之中

3.改进的DataNode发送block reports到Primary NameNode与Standby NameNode

4.改进的HDFS客户端将在每个事物开始之前对Zookeeper进行检查,如果失败会转移到另外的事务之中。同时如果AvatarNode故障转移出现在写入的过程中,AvatarNode的机制将允许保证完整的数据写入。

Avatarnode客户端

Avatarnode DataNode

或许有人会Facebook这一解决方案的名字感到好奇,这是因为Facebook的Hadoop工程师Dhruba Borthakur来到公司时正好是James Cameron《阿凡达》电影热映时间。(我们应该感到庆幸,如果是1998年的话或许应该叫TitanicNode了)。

AvatarNode经受住了Facebook内部最苛刻的工作环境,未来Facebook将继续大幅度改善AvatarNode的可靠性和HDFS集群的管理性。并整合与一般高可用性框架的整合,还将实现无人值守、自动化与安全故障转移等特性。

Facebook已将自身使用的Hadoop与AvatarNode解决方案托管到GitHub。感兴趣的朋友可下载研究。

当然不止Facebook在试图解决Hadoop的缺陷,MapR和Cloudera的产品也具备相似的能力。(李智/编译)

关于作者

Andrew Ryan 2009年加入Facebook,他主要负责完善Facebook Hadoop和HDFS,在从2009年至今的日子中,他帮助Facebook从以往单数据中心部署600TB数据集群发展到在不同的数据中心部署100 HDFS集群。

Facebook公开其Hadoop与Avatarnode代码——有效解决Namenode顽疾的更多相关文章

  1. twitter、facebook、pinterest、linkedin 分享代码

    twitter.facebook.pinterest.linkedin 分享代码 http://www.cnblogs.com/adstor-Lin/p/3994449.html

  2. Hadoop源码学习笔记之NameNode启动场景流程一:源码环境搭建和项目模块及NameNode结构简单介绍

    最近在跟着一个大佬学习Hadoop底层源码及架构等知识点,觉得有必要记录下来这个学习过程.想到了这个废弃已久的blog账号,决定重新开始更新. 主要分以下几步来进行源码学习: 一.搭建源码阅读环境二. ...

  3. Hadoop源码学习笔记之NameNode启动场景流程二:http server启动源码剖析

    NameNodeHttpServer启动源码剖析,这一部分主要按以下步骤进行: 一.源码调用分析 二.伪代码调用流程梳理 三.http server服务流程图解 第一步,源码调用分析 前一篇文章已经锁 ...

  4. Hadoop常见错误问题及解决方法总结二

    问题导读:1.遇到问题该如何排除错误?2.看不到namenode的可能原因是什么?3.地址占用该如何解决?4.could only be replicatied to 0 nodes, instead ...

  5. hadoop常见错误汇总及解决办法一

    我们经常会遇到一些问题,而且可能会重复性遇到,这些方案可以收藏为以后备用.我们经常遇到如下问题:1.两次以上格式化造成NameNode 和 DataNode namespaceID 不一致,有几种解决 ...

  6. 使用IDEA操作Hbase API 报错:org.apache.hadoop.hbase.client.RetriesExhaustedException的解决方法:

     使用IDEA操作Hbase API 报错:org.apache.hadoop.hbase.client.RetriesExhaustedException的解决方法: 1.错误详情: Excepti ...

  7. C# 防止同时调用=========使用读写锁三行代码简单解决多线程并发的问题

    http://www.jb51.net/article/99718.htm     本文主要介绍了C#使用读写锁三行代码简单解决多线程并发写入文件时提示"文件正在由另一进程使用,因此该进程无 ...

  8. 从代码上解决Jenkins 发送邮件中文乱码问题

    在实践中,使用Jenkins发送测试报告,收到邮件,邮件内容中的中文为乱码,邮件发送的方式是在Jenkins发邮件设置中设置邮件内容为:${FILE,path="report_ug.html ...

  9. Hadoop分布式集群部署(单namenode节点)

    Hadoop分布式集群部署 系统系统环境: OS: CentOS 6.8 内存:2G CPU:1核 Software:jdk-8u151-linux-x64.rpm hadoop-2.7.4.tar. ...

随机推荐

  1. logstash 各种时间转换

    <pre name="code" class="html">日期格式转换: /***** nginx 访问日志 [elk@zjtest7-front ...

  2. libeXosip2(3) -- SIP messages and call control API

    SIP messages and call control API The SIP messages and call control API. More... Modules eXosip2 INV ...

  3. 解决java压缩图片透明背景变黑色的问题

    public static BufferedImage resize(int faceWidth,BufferedImage srcImg,HttpServletRequest request) th ...

  4. 【剑指offer】面试题40:数组中只出现一次的数字

    题目: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 思路: 因为只有两个只出现一次的数字,所以所有数字进行异或之后得到值res一定不是0.这样,res ...

  5. 符号表(Symbol Tables)

    小时候我们都翻过词典,现在接触过电脑的人大多数都会用文字处理软件(例如微软的word,附带拼写检查).拼写检查本身也是一个词典,只不过容量比较小.现实生活中有许多词典的应用: 拼写检查 数据库管理应用 ...

  6. UIView添加支持代码块的手势

    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(a ...

  7. LeetCode 191. Number of 1 Bits Question

    题意:给你一个整数,计算该整数的二进制形式里有多少个“1”.比如6(110),就有2个“1”. 一开始我就把数字n不断右移,然后判定最右位是否为1,是就cnt++,否则就继续右移直到n为0. 可是题目 ...

  8. Window的匿名Closing 事件

    group.Closing += (sender, e) => { try {   Code here } } catch (Exception ex) { Exception here } } ...

  9. Android 体系结构

    Anroid是在Linux基础开发出的一个移动设备开发平台.它自上而下包含四个部分: Application(应用程序) Applicaton Framework(应用程序框架) Libraries& ...

  10. shell脚本一条命令直接发送http请求(xjl456852原创)

    我们知道nc命令是一个网络工具.可以连接tcp/udp.也能模拟发送http请求. 现在介绍通过shell脚本,一条命令直接发送http请求. 命令如下,可以对下面的地址等信息自行修改: #!/bin ...