当前位置: 首页 > 编程日记 > 正文

Facebook的实时Hadoop系统

原文地址:

http://blog.solrex.org/articles/facebook-realtime-hadoop-system.html

作者:杨文博

Facebook 在今年六月 SIGMOD 2011 上发表了一篇名为“Apache Hadoop Goes Realtime at Facebook”的会议论文 (pdf),介绍了 Facebook 为了打造一个实时的 HBase 系统使用到的独门秘技。由于该论文提到的应用场景与小弟负责的系统要解决的问题域有相似之处,因而抽时间仔细阅读了这篇论文。下面便是结合论文的内容,谈一谈我的一些看法和感想,如有谬误,敬请指正。

这篇 10 页的长文主要的内容是 Facebook 在 Hadoop 系统上的工程实践,这些工程实践的目标则是题目所点出的——实时。虽然缺乏 Hadoop 系统的开发或使用经验,但是我觉得并没有妨碍我对这篇论文的理解。在我的脑子里,HDFS 就是 GFS,HBase 就是 BigTable。它们实现上可能有差异之处,但主要的思想应该是相通的。如果熟悉 GFS 和 BigTable 那两篇文章,这篇文章就可以视为 GFS 和 BigTable “进阶”。

1. 应用场景和需求

文章的最初是一些背景介绍,主要给出了三类应用场景:Facebook Messaging、Facebook Insight 和 Facebook Metrics System(ODS)。Messaging 就是 Facebook 的新型消息服务,Insight 是提供给开发者和网站主的数据分析工具,ODS 则是 Facebook 内部的软硬件状态统计系统。这三个应用场景都有各自的特色,但简单地来说,面临的问题是同样的:单机或者拆分的关系型数据库无法满足需求。

基于应用场景的数据特征,Facebook 抽象出了几个对存储系统的需求。由于描述起来有些复杂,例如 Efficient and low-latency strong consistency semantics within a data center,这些需求就不一一列举了。相比需求,更让人感兴趣的是它的那些“非需求”,总共有三条:

  1. 容忍单数据中心内部的网络分化,Facebook 认为这个问题应该从网络硬件层面(做冗余设计)而不是软件层面去解决;
  2. 单个数据中心宕机不影响服务,Facebook 认为这种灾难很难发生,因而愿意接受这种风险;
  3. 跨数据中心的数据热备服务能力,Facebook 假设用户数据是分配到固定的数据中心的,可能带来的响应延迟问题应该通过缓存来解决。

从这些“非需求”上可以看出,Facebook 考虑的是更实际的情况,而不是一个理想中的分布式系统,在这点上有一定的借鉴意义。

根据以上的需求和非需求,Facebook 自然而然地给出选择 Apache Hadoop 这套系统的理由,其中有社区的成熟度、Hadoop 在一致性、扩展性、可用性、故障容忍、读写效率等等的各项优点,这些方面的优点也是有目共睹的。

2. 打造实时的 HDFS

HDFS 本身设计来支持离线 MapReduce 计算的分布式文件系统,虽然在扩展性和吞吐上有很好的表现,但在实时性方面表现并不好。如果想让基于 HDFS 的 HBase 有更好的性能,HDFS 层的优化是不可避免的。为了把 HDFS 打造成一个通用的低时延文件系统,Facebook 主要做了以下一些优化。

2.1 实现 NameNode 的高可用——AvatarNode

HDFS 的 NameNode 是系统单点,就意味着 NameNode 挂掉会导致系统的不可用。NameNode 重启时加载内存快照、应用log和收集 DataNode 的数据块信息报告大概需要 45 分钟。即便使用了 BackupNode,仍然需要收集数据块信息报告,切换的时间仍然可能大于 20 分钟。但有实时性需求的系统一般都会要求系统 24x7 的可用性,因而 Facebook 对单点的 NameNode 进行了改进,实现了 NameNode 的双节点热备,称为 AvatarNode,如下图所示:

AvatarNode

简单地来说,备份 AvatarNode 通过 NFS 读取并回放主 AvatarNode 的事务日志来保持数据的同步,并同时接收 DataNode 的数据块信息报告,这保证了主备 AvatarNode 的数据差距尽可能地小,使得备份 AvatarNode 能够很快地切换为主节点的角色。主备 AvatarNode 的角色是注册到 ZooKeeper 中的,DataNode 可以根据 ZooKeeper 中信息判断需要服从哪个 AvatarNode 节点的指令。

为了实现热备 AvatarNode 的数据同步和易用性,Facebook 还改进了 NameNode 事务日志,并部署了 DAFS (Distributed Avatar File System) 屏蔽了 AvatarNode 的故障切换,使得这些改变对客户端透明。文中并没有提到 AvatarNode 的切换是手工还是自动进行的,但是考虑到 ZooKeeper 的 lease 机制,自动切换应该不难实现。

2.2 Hadoop RPC 兼容性和数据块可用性

在之前的系统需求中,有提到一点是 Fault Isolation,并且 Facebook 的 Hadoop 系统是在单机房部署的,因而同一个服务必然会使用多套 Hadoop 系统。为了系统升级独立方便,使客户端兼容不同版本的 Hadoop RPC 是自然而然的事情。

HDFS 在分配副本数据块位置时,虽然会考虑到机架位,但整体来说仍然是相当随机的。其实我以前也曾经与同事讨论过类似的问题,到底是选择随机分配副本位置,还是使用一定的组策略去分配。随机分配的好处是简单均衡,坏处是一旦发生多台宕机,由于副本随机分布,导致某块数据副本全部丢失概率很大;用一定的组策略去分配的好处是多台宕机如果不发生在同一组里,不会丢数据,但是一旦多台宕机发生在同一组,会丢很多数据。看来 Facebook 是选用了组策略分配的方法,认为多台宕机发生在同一组的概率不大。

但这样做是否正确,我是有疑问的。同一个机架或相邻机架上的服务器一般上架时间、硬件型号等都相同,那么同时发生故障的事件不是完全独立的,其概率是要大于理想故障分布情况下概率的。我想这也是为什么 Facebook 最终方案中一组机器是 (2, 5),2 个机架,5 台服务器。这两个机架的选择,如果很谨慎的话,能够尽量避免我说的这种情况。不过,凡事还得看执行力,如果不了解部署情况去选择机架的话,不一定能够达到预期效果。

2.3 实时负载的性能优化

除了上面的改动之外,Facebook 还对客户端的 RPC 过程进行了优化。为 RPC 添加超时机制,加快文件 lease 的撤销速度(由于对 HDFS 文件操作不了解,我没明白为什么要加快 lease 撤销)。

此外,还提到了最重要的一点:局部性!Facebook 增加了一个检查文件块是否在本机的功能,如果在本机就直接读取。不知道它具体实现方式是怎样的,但我觉得这个做法其实是“很黄很暴力”的,不知道会不会破坏数据一致性。

2.4 HDFS sync 优化和并发读

为了提高写性能,Facebook 允许不等待 sync 结束就继续写,这一点看起来也很暴力,不知道会不会影响数据正确性。

为了能够读到最新数据,Facebook 允许客户端读一个还未写完的数据文件。如果读到正在写入的最后一个块,就重新计算 checksum。

3. 打造实时生产坏境的 HBase

3.1 行级别原子性和一致性

虽然 HBase 已经保证了行级别的原子性,但节点宕机可能导致最后一条更新日志不完整。Facebook 不够满意,引入了 WALEdit,一个日志事务概念来保证每条更新日志的完整性。

一致性方面,看来 HBase 能够满足需求。不过对于 3 个副本同时校验失败导致数据块不可用的情况,Facebook 增加了事后分析的机制,而不是简单丢弃。

3.2 可用性

为了提高 HBase 的可用性,Facebook 对其进行了完善的测试,并解决了以下几个问题:

  1. 重写 HBase Master,将 ragion 分配信息存储到 ZooKeeper 中以保证宕机切换正确完成。
  2. 使得 compaction 可以中断以加速 RegionServer 的正常退出速度,并实现 rolling restarts(就是逐台升级),降低程序升级对服务的影响。
  3. 将宕机 RegionServer 的日志拆分功能从 Master 中拆离,由多个 RegionServer 进行拆分,以提高 RegionServer 故障恢复效率。

这几个问题的解决倒是有通用的用途,我想不久以后很有可能会合并到 Hadoop 的代码中。

3.3 性能优化

性能优化主要从两点进行,一个是 compaction 性能,另一个是读性能。

读过 BigTable 论文的应该对其 memtable 和 compaction 的特性比较熟悉。这里主要讨论了让 minor compaction 也删除数据的好处,以及如何做 major compaction 能够提高合并的性能。

在数据读性能方面,文章里主要讨论了减少 IO 操作的方法,其中包括 bloom filter 和特定类型 meta 信息(时间戳)的使用。还有很重要的一点,在部署上保持 RegionServer 和物理文件的局部性!

文章后面还给出了 Facebook 在部署和运维方面的一些经验,其中有一些有趣的点,我后续可能会写篇文章专门讨论,这里就不详细说明了。

4. 总结

以前我们也曾经讨论过如何在分布式文件系统的基础上搭建一套实时数据分析系统,当时认为如果有成熟的 GFS 可用的话,这个工作会比较简单。现在读到 Facebook 的这篇文章,才发现当初想法的幼稚。仅仅从这篇文章中的技术点体现出的工作量来看,文中说这个系统是多年持续工作的结晶是令人信服的。当然,这也意味着想复制一套这样的系统并不是件轻松容易的事。

从系统设计的成果来看,这个系统应该能达到文章开头制定的需求目标,并也能够满足大部分应用场景的需要。不过有一点,我存在疑问,即是为 Insights 提供的 Realtime Analytics 功能。Realtime 没问题,但使用 HBase, Analytics 究竟能支持多好呢?可能还需要再去了解 HBase 的功能才能有答案。

从这个系统的很多细节可以发现,有不少折中和 trick。我想这就是现实世界,凡事很难做到尽善尽美,工程也一样。在设计系统时追求完美没有错,但是需要考虑代价和可行性,不要忘记满足需求才是最重要的目标。除此之外,也不妨再列出一些“非需求”,排除这些限制可能会降低不少的系统复杂度。

相关文章:

Ka的回溯编程练习 Part1|整划什么的。。

1 #include<stdio.h>2 int search(int s,int t);3 void op(int k);4 int res[1001]{1},n;5 int main()6 {7 //scanf("%d",&n);8 n10;9 search(n,1); 10 return 0; 11 } 12 int search(int s,int t) //当前数的大小s&#xff0c;个数n 13 …

开发者关心的十个数据库技术问题

作者 | 雷海林 责编 | 田玮靖出品 | 《新程序员》如今&#xff0c;数据库越来越受到业界的广泛关注&#xff0c;许多高校毕业生及资深技术人也逐渐投身于数据库产业。《新程序员002》经过用户、专家调研&#xff0c;收集汇总了十个开发者关心的数据库技术问题&#xff0c…

使用T-SQL语句操作数据表-更新数据

使用update语句更新表中的数据。也就是修改表中的数据。update语法格式&#xff1a;update <表名> set <列名更新值> [where <更新条件>] 解释&#xff1a;update 是更新数据名&#xff0c; 表明是更新数据set 是必要的&#xff0c; 后面可以紧随多个数据列的…

Category Archives: Linux

原文地址&#xff1a;http://blog.solrex.org/articles/solrex-linux-cheatsheet.html Cheatsheet&#xff1a;原意是考试的时候带的小抄&#xff0c;所以说是 cheat&#xff08;作弊&#xff09; sheet。在计算机科学领域里&#xff0c;主要是指记录一些难记命令或者操作的快查…

利用 OpenCV+ConvNets 检测几何图形

作者 | 小白 来源 | 小白学视觉 导读 人工智能领域中增长最快的子领域之一是自然语言处理&#xff08;NLP&#xff09;&#xff0c;它处理计算机与人类&#xff08;自然&#xff09;语言之间的交互&#xff0c;特别是如何编程计算机以处理和理解大量自然语言数据。 自然语言处理…

《Linux实践及应用》

2019独角兽企业重金招聘Python工程师标准>>> 《Linux实践及应用》 本书以RedHat 9.0为蓝本&#xff0c;系统地介绍Linux的基础知识、Linux系统的安装与配置、常用命令&#xff0c;以及如何进行Linux系统管理和基本的网络服务设置&#xff08;包括如何设置DNS服务器、…

找不到包含 OwinStartupAttribute 的程序集

2019独角兽企业重金招聘Python工程师标准>>> 尝试加载应用时出现了以下错误。 找不到包含 OwinStartupAttribute 的程序集。找不到包含 Startup 或 [AssemblyName].Startup 类的程序集。 若要禁用 OWIN 启动发现&#xff0c;请在 web.config 中为 appSetting owin:A…

Imagination 推新款GPU IP,首次实现桌面级光线追踪效果

游戏界被炒得最热的概念可能就是光线追踪技术了&#xff0c;不仅仅是PC端的游戏。光线追踪所展示出来的画面效果也确实惊艳&#xff0c;可以让我们感叹到图像技术达到的一个新高度。 但是实际上&#xff0c;光线追踪并不是一个新技术。10年前&#xff0c;光追就是游戏玩家茶余…

percent之集合

2019独角兽企业重金招聘Python工程师标准>>> 这个留到明天再来写吧,今天把hub剩下的坑填掉. 转载于:https://my.oschina.net/u/2011113/blog/416458

Mr. Process的一生-Linux内核的社会视角 (2)启动

原文地址&#xff1a; http://www.manio.org/cn/startup-of-linux-view-of-society.html 其实这才应该是这一系列文章的第一节&#xff0c;因为这篇文章讲的是盘古开天地的事。话说Mr. Process是一个现代人&#xff0c;但是&#xff0c;只要是人&#xff0c;总该有个祖先。人们…

深入研究ConcurrentHashMap 源码从7到8的变迁

ConcurrentHashMap是线程安全且高效的HashMap 1 为什么要使用ConcurrentHashMap 线程不安全的HashMap HashMap是Java中最常用的一个Map类&#xff0c;性能好、速度快&#xff0c;但不能保证线程安全&#xff0c;它可用null作为key/value HashMap的线程不安全主要体现在resize时…

IANA定义的常见服务的端口号列表

最新明细&#xff1a;http://www.iana.org/assignments/port-numbers 几个重要常见端口&#xff1a; 21 FTP 22 SSH 80 HTTP 443 HTTPS 1433 MSSQLserver 3306 MySQL 11211 memcached

oracel 服务详细介绍

中的方法成功安装Oracle 11g后&#xff0c;共有7个服务&#xff0c; 这七个服务的含义分别为&#xff1a; 1. Oracle ORCL VSS Writer Service&#xff1a; Oracle卷映射拷贝写入服务&#xff0c;VSS&#xff08;Volume Shadow Copy Service&#xff09;能够让存储基础设备&…

使用 Python 开发一个恐龙跑跑小游戏,玩起来

作者 | 周萝卜 来源 | 萝卜大杂烩 相信很多人都玩过 chrome 浏览器上提供的恐龙跑跑游戏&#xff0c;在我们断网或者直接在浏览器输入地址“chrome://dino/”都可以进入游戏 今天我们就是用 Python 来制作一个类似的小游戏 素材准备 首先我们准备下游戏所需的素材&#xff0c;比…

了解和入门注解的应用

2019独角兽企业重金招聘Python工程师标准>>> 一、概述 jdk的java.lang包中提供的最基本的annotation 1、SuppressWarnings("deprecation") package staticimport.annotation;SuppressWarnings("deprecation") public class AnnotationTest {pub…

Linux下开发优秀链接

不得不说CSDN博客这次改版变化很大&#xff0c;但是友情链接功能太脆弱了。 只有自己写个帖子&#xff0c;不断更新吧。Linux基础 Linux内核mirrors163LVS中文站点 孙海龙 howtoforge.com 地中海东岸的蒲公英 服务器运维与网站架构 Nginx中文维基 ACME Bory.Chan Tim[后端技术]…

Q 版老黄带着硬核技术再登场,有点可爱,很有东西

编译 | 禾木木 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 看到下面这个老黄是不是觉得很Q~ 11月9日&#xff0c;GTC 大会再次来了&#xff0c;英伟达创始人兼CEO黄仁勋再次从自己虚拟厨房走出来。 本次 GTC 大会都有哪些亮点呢&#xff1f; Q 版黄仁勋 英伟达展…

linux第七章《档案与目录管理》重点回顾

转载于:https://www.cnblogs.com/wubingshenyin/p/4514969.html

Effective java 43返回零长度的数组或者集合而不是null

转载于:https://www.cnblogs.com/limingxian537423/p/8391285.html

《Unix网络编程卷1-套接字联网API》第一个例子编译 不通过问题解决

《Unix网络编程卷1-套接字联网API》是本好书。 但是第一个例子不是很好编译。 需要如下步骤&#xff1a; 本人机器CentOS 5.4 1.下载源码 unpv13e解压到任意目录 然后按其readme文件操作./configure # try to figure out all implementation differencescd lib # bu…

angularJs的学习笔记-01(创建项目)

1&#xff0c;进入angular-phonecat目录 执行下面命令 git checkout -f step-0 然后访问 http://localhost:8000/app/ 页面出现 “Nothing here yet!” 现在就可以自己创建HTML&#xff0c;编写angular了 app/index.html <!doctype html> <html lang"en"…

一文搞定深度学习建模预测全流程(Python)

作者 | 泳鱼来源 | 算法进阶本文详细地梳理及实现了深度学习模型构建及预测的全流程&#xff0c;代码示例基于python及神经网络库keras&#xff0c;通过设计一个深度神经网络模型做波士顿房价预测。主要依赖的Python库有&#xff1a;keras、scikit-learn、pandas、tensorflow&a…

第163天:js面向对象-对象创建方式总结

面向对象-对象创建方式总结 1、 创建对象的方式&#xff0c;json方式 推荐使用的场合&#xff1a; 作为函数的参数&#xff0c;临时只用一次的场景。比如设置函数原型对象。 1 var obj {};2 //对象有自己的 属性 和 行为3 // 属性比如&#xff1a; 年龄、姓名、性别4 // 行…

一个从四秒到10毫秒,花了1年的算法问题?

原文:一个从四秒到10毫秒&#xff0c;花了1年的算法问题&#xff1f;五一后的第一周&#xff0c;由于搬家腰扭伤了&#xff0c;没注意导致压迫神经&#xff0c;躺在床上休息了好几天。所以没事就挂 QQ&#xff0c;一个网友突然问了我一个算法问题。所以有了这篇文章。感触很深&…

xinetd 说明

xinetd 是什么在linux中一些不长期使用的服务&#xff08;不重要的服务&#xff1f;&#xff09;没有被作为单独的守护进程在开机时启用&#xff0c;linux把这些服务监听端口全部由一个独立的进程xinetd集中监听&#xff0c;当收到相应的客户端请求之后&#xff0c;xinetd进程就…

英特尔携手中科院计算所建立中国首个 oneAPI 卓越中心

11月12日&#xff0c;在第三届中国超级算力大会&#xff08;ChinaSC 2021&#xff09;上&#xff0c;英特尔与中国科学院计算技术研究所共同建立中国首个 oneAPI 卓越中心&#xff0c;来扩大 oneAPI 对中国本土国产硬件的支持及使用oneAPI来开发全栈式开源软件。 在上个月刚结…

前端学习资源分享

2019独角兽企业重金招聘Python工程师标准>>> 推荐大神文章(文字教程) 1 综合类 前端知识体系前端知识结构Web前端开发大系概览Web前端开发大系概览-中文版智能社 - 精通JavaScript开发JavaScript中的this陷阱的最全收集--没有之一JS函数式编程指南腾讯移动Web前端知…

Nginx源码分析链接

nginx-0.8.38源码探秘&#xff1a;http://blog.csdn.net/ccdd14/article/details/5872312nginx源码分析&#xff1a; http://blog.sina.com.cn/s/blog_677be95b0100iiv7.html

基于聚类的图像分割(Python)

作者 | 小白来源 | 小白学视觉了解图像分割当我们在做一个图像分类任务时&#xff0c;首先我们会想从图像中捕获感兴趣的区域&#xff0c;然后再将其输入到模型中。让我们尝试一种称为基于聚类的图像分割技术&#xff0c;它会帮助我们在一定程度上提高模型性能&#xff0c;让我…

4月第4周全球域名商TOP15:万网第四 增势减弱

IDC评述网&#xff08;idcps.com&#xff09;05月21日报道&#xff1a;据WebHosting.info公布的最新数据显示&#xff0c;在4月第4周&#xff0c;全球十五强域名商中&#xff0c;域名总量成功实现净增长的有7家。其中&#xff0c;中法各1家&#xff0c;即中国万网与OVH.NET&…