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. JAVA中this用法小结[转]

    Java关键字this只能用于方法方法体内.当一个对象创建后,Java虚拟机(JVM)就会给这个对象分配一个引用自身的指针,这个指针的名字就是 this.因此,this只能在类中的非静态方法中使用,静 ...

  2. 【原创】基于部署映像服务和管理(DISM)修改映象解决WIN7 USB3.0安装时报错

    本文作者为博客园阿梓喵http://www.cnblogs.com/c4isr/,转载请注明作者. 本文源地址:http://www.cnblogs.com/c4isr/p/3532362.html ...

  3. 开始慢慢学习这本书了。。Python编程实战:运用设计模式、并发和程序库创建高质量程序

    没办法,不到设计模式,算法组合这些,在写大一点程序的时候,总是力不从心...:( 一开始可能要花很多时间来慢慢理解吧,,这毕竟和<大话设计模式>用的C#语言有点不太一样... 书上代码是3 ...

  4. IIS Express 的 applicationhost.config配置文件

    文件所在目录 C:\Users\admin\Documents\IISExpress\config 或者 C:\Program Files\IIS Express\AppServer\ //加载语言文 ...

  5. codility上的问题 (19)Sigma 2012

    题目: 像最大直方图一样给定一个数组是每个单位长度上的高度,求至少几个矩形可以拼出这个形状. 例如:给出的数组 H[0] = 8 H[1] = 8 H[2] = 5 H[3] = 7 H[4] = 9 ...

  6. bzoj 1197

    http://www.lydsy.com/JudgeOnline/problem.php?id=1197 我们考虑从低维向高维考虑. 记F[i][j]表示维度为i,用了j个球时最多能将空间划分为多少个 ...

  7. hdu4521-小明系列问题——小明序列(线段树区间求最值)

    题意:求最长上升序列的长度(LIS),但是要求相邻的两个数距离至少为d,数据范围较大,普通dp肯定TLE.线段树搞之就可以了,或者优化后的nlogn的dp. 代码为  线段树解法. #include ...

  8. c语言结构体5之匿名结构体

    注意: 1匿名结构体不会出现重合 重命名的情况 2有名结构体 名称不能相同 也就是不能重名 //匿名结构体不会出现重名的情况 struct //无名结构体 { ]; ]; int num; };//不 ...

  9. Python一日一练05----怒刷点击量

    功能 自己主动获取CSDN文章列表,并对每篇文章添加点击量. 源代码 import urllib.request import re import time import random from bs ...

  10. android EditText插入字符串到光标所在位置

    EditText mTextInput=(EditText)findViewById(R.id.input);//EditText对象 int index = mTextInput.getSelect ...