写点什么

Facebook 的实时流处理技术

2016 年 7 月 20 日

随着云计算大数据的发展,有越来越多的场景需要借助于实时数据处理技术,为此有很多公司开发了自己的实时处理系统,Facebook 就是其中的一员,他们构建的实时数据处理生态系统每秒钟能够处理数百 GB 的数据。本文介绍了 Facebook 在设计该系统时从易用性、性能、容错、可伸缩性以及正确性等方面考虑所做的重要设计决策,这些决策和系统如何满足秒级的延迟需求,以及在构建该系统的过程中 Facebook 所总结的经验教训。

Facebook 认为在设计一个实时数据处理系统的时候首先要想清楚下面 5 个问题:

  • 易用性:处理需求有多复杂?SQL 是否足够?是否必须要使用 C++ 或者 Java 这样的编程语言?用户编写、测试和部署一个新的应用程序需要多长时间?
  • 性能:允许多长时间的延迟,毫秒级,秒级,还是分钟级?单机或者总体需要多大的吞吐量?
  • 容错能力:可以容忍哪些类型的错误?数据处理或输出的次数通过什么语义来保证?系统如何存储和恢复内存状态?
  • 可伸缩性:数据是否支持分片从而进行并行处理?系统是否能够容易地随着数据量的变化进行调整?是否可以重新处理之前的有价值的老数据?
  • 正确性:是否需要 ACID 特性?作为输入的所有数据是否都需要被处理并在最终的结果中出现?

针对这些问题,Facebook 提出了 5 个设计决策:语言范式、数据传输、处理语义、状态保存机制以及数据再处理。下面的图表展示了每一个设计决策对数据质量属性的影响:

以及不同的流处理系统所做的设计决策:

语言范式决定了编写应用程序的难易程度以及开发者对性能的操控程度。基本有三种选择:声明式,函数式以及过程式编程语言。对于 Facebook 而言,单一的某种语言无法满足所有的用例,因此他们开发了三种不同的流处理系统。
数据传输对流处理系统的容错性、性能和可伸缩性都有非常大的影响,传统的数据传输方式包括:直接消息传输、基于代理的消息传输和基于持久化存储的消息传输。Facebook 使用 Scribe,一种持久化的消息总线,来连接不同的处理节点。
处理语义包括状态语义(每一个输入事件最少被计数一次、最多被计数一次还是只被计数一次?)和输出语义(给定的输出值在输出流中最少出现一次、最多出现一次还是只出现一次?)。其中无状态的处理器只有输出语义,而有状态的处理器这两种语义都有。Facebook 对不同的应用通常有不同的状态和输出语义需求,因而开发了 Puma、Stylus 和 Swift 三个支持不同语义的系统。
状态保存机制的实现方式有很多,包括复制副本、本地数据库持久化、远程数据库持久化、上游备份以及全局一致性快照等。Facebook 实现了两种状态保存机制,其中 Puma 实现了远程数据库存储,而 Stylus 则实现了本地和远程数据库存储。
再处理的方式有三种:仅使用流处理;维护两个单独的系统,一个用于流处理,一个用于批处理;开发一个能够在批处理环境中运行的流处理系统。Facebook 采用了一种与 Spark Streaming 以及 Flink 都不同的处理方式,他们使用标准的 MapReduce 框架从 Hive 中读取数据并在批处理环境中运行流处理应用程序。Puma 应用可以运行在 Hive 环境中,而 Stylus 则提供了三种类型的处理器:无状态的处理器,通用的有状态的处理器和一个居中的流处理器。

在系统建设方面,Facebook 的主要设计目标是秒级的延迟,每秒钟能够处理几百 GB 的数据,为此他们通过一个持久化消息总线将所有的处理组件连接起来进行数据传输,同时也将数据的处理和传输解耦,实现容错、可伸缩、易用性和正确性。整个系统的架构图如下:

该图阐述了 Facebook 实时处理系统的数据流,数据从左侧的移动和 Web 产品中产生,然后被送入 Scribe(一个分布式数据传输系统),而 Puma、Stylus 和 Swift 等实时流处理系统则从 Scribe 中读取数据并将处理结果写入 Scribe。Puma、Stylus 和 Swift 可以根据需要通过 Scribe 连接成一个复杂的 DAG(有向无环图)。

接下来是使用该实时处理系统的一个示例应用,该应用识别一个输入事件流中的趋势事件,以 5 分钟为单位对这段时间内产生的话题按事件数排序。每个事件包含一个事件类型,一个维度 ID(用于获取事件的维度信息,例如使用的编程语言)和一个文本(用于分类事件主题,例如电影或者婴儿)。该应用有 4 个处理节点,每一个都可以并行执行,整体流程图如下:

在该图中,Filterer 会根据事件类型过滤输入流,然后将输出按照维度 ID 进行分片,这样下一个节点就能够并行处理分片数据了。Joiner 通过维度 ID 从一个或者多个外部系统检索信息,然后根据事件的文本内容对其按照话题进行分类。Scorer 记录着最近一段时间内每一个话题的事件数,同时还会跟踪这些计数器的长期趋势。Ranker 则计算每 N 分钟每一个话题的前 K 个事件是什么。

最后是 Facebook 在构建该系统的过程总结的一些经验教训:首先,没有一个单独的流处理系统能够适应所有场景,针对不同的点使用不同的系统才能更好地解决问题;其次易用性不仅包括使用,还包括开发、调试、部署、监控和运维等方面;最后,流处理和批处理并不是互斥的,组合使用这两种系统能够加速数据的处理速度。


感谢杜小芳对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2016 年 7 月 20 日 19:004091
用户头像

发布了 321 篇内容, 共 103.6 次阅读, 收获喜欢 8 次。

关注

评论

发布
暂无评论
发现更多内容

面试系列二:精选大数据面试真题JVM专项-附答案详细解析

五分钟学大数据

大数据 28天写作 3月日更

Docker 常用命令,还有谁不会?

xcbeyond

Docker 常用命令 28天写作

Kubelet从入门到放弃:拓扑管理(上)

DCOS

Linux Kubernetes 云原生 kubelet

第五周 继续文档的一些细节

Sicolas Flamel

产品经理 产品经理新人如何落地 产品经理训练营

加快布局区块链技术发展,助力网络强国建设

CECBC区块链专委会

区块链

这个新春,你的云端安全守卫来咯 | 新服务上线

亚马逊云科技 (Amazon Web Services)

关于搜商的一点记录「Day 9」

道伟

28天写作

翻译:《实用的Python编程》03_02_More_functions

codists

Python

一篇读懂https的本质、证书验证过程以及数据加密

梁龙先森

前端 https 前端进阶

大厂动态规划面试汇总,教你如何修炼内功

Kevin

算法 动态规划 数据结构和算法 笔试

javascript中的内存管理

程序那些事

JavaScript nodejs 内存管理 程序那些事

手写一个LRU缓存淘汰算法

Simon郎

Java 大数据 缓存 LRU 数据结构与算法

「产品经理训练营」作业 05:知识星球加入星球流程图

狷介

产品经理训练营

肝了很久,冰河整理出这份4万字的SpringCloud与SpringCloudAlibaba学习笔记!!

冰河

微服务 高可用 高并发 冰河技术 SpringCloud Alibaba

java学习笔记(一)

陈皮

Java

如果重来,结果就会好吗?「Day 10」

道伟

28天写作

真实字节二面:什么是伪共享?

艾小仙

Java 程序员 字节跳动 面试 面试大厂

VR,正在上演一出“风月宝鉴”

脑极体

产品经理训练营 - 第四章作业 (二)

joelhy

产品经理训练营

【管理笔记16】行销市场区隔化与目标市场

俊毅

dubbo 源码 v2.7 分析:核心机制(一)

程序员架构进阶

架构 源码分析 dubbo 七日更 28天写作

产品经理训练营作业 04

KingSwim

谁才是一级方程式赛车中的最强车手?

亚马逊云科技 (Amazon Web Services)

2021年美团/字节跳动/腾讯面经总结:互联网工程师必备的面试1000题

比伯

Java 编程 程序员 架构 面试

敏捷, 是一种信仰

boshi

敏捷 七日更 28天写作

打破垄断 上海发布自主研发树图区块链重大成果

CECBC区块链专委会

区块链

星环科技Sophon Edge边缘计算平台持续赋能千家万业

星环科技

代码从业者

ES_her0

28天写作 3月日更

(28DW-S8-Day10) T型学习模式:迁移式学习

mtfelix

T型人才 28天写作 迁移学习 一万小时定律

第五次作业

Geek_79e938

SQL Server 多表数据增量获取和发布 2.1

happlyfox

28天写作 3月日更

演讲经验交流会|ArchSummit 上海站

演讲经验交流会|ArchSummit 上海站

Facebook的实时流处理技术-InfoQ