Facebook的实时流处理技术——Scuba是Facebook的一个非常快速、分布式的内存数据库,用于实时分析和查询
Scuba,Facebook的一个非常快速、分布式的内存数据库,用于实时分析和查询。是Facebook的回归分析代码、错误报告监控、广告收入监控和性能调试的背后主力。
Facebook的实时流处理技术
随着云计算大数据的发展,有越来越多的场景需要借助于实时数据处理技术,为此有很多公司开发了自己的实时处理系统,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在构建该系统的过程总结的一些经验教训:首先,没有一个单独的流处理系统能够适应所有场景,针对不同的点使用不同的系统才能更好地解决问题;其次易用性不仅包括使用,还包括开发、调试、部署、监控和运维等方面;最后,流处理和批处理并不是互斥的,组合使用这两种系统能够加速数据的处理速度。
Facebook的实时流处理技术——Scuba是Facebook的一个非常快速、分布式的内存数据库,用于实时分析和查询的更多相关文章
- Nginx-rtmp 直播媒体实时流实现
0. 前言 这段时间在搭建一个IPCamera项目服务器.视频点对点通话,客户端会查看设备端的音视频实时流.为了省流量,是通过P2P进行穿透.但是由于NAT设备的原因和IPV4的枯竭.有些设备是无法进 ...
- Storm分布式实时流计算框架相关技术总结
Storm分布式实时流计算框架相关技术总结 Storm作为一个开源的分布式实时流计算框架,其内部实现使用了一些常用的技术,这里是对这些技术及其在Storm中作用的概括介绍.以此为基础,后续再深入了解S ...
- Storm概念学习系列之什么是实时流计算?
不多说,直接上干货! 什么是实时流计算? 1.实时流计算背景 2.实时计算应用场景 3.实时计算处理流程 4.实时计算框架 什么是实时流计算? 所谓实时流计算,就是近几年由于数据得到广泛应用之后 ...
- Spark入门实战系列--7.Spark Streaming(上)--实时流计算Spark Streaming原理介绍
[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .Spark Streaming简介 1.1 概述 Spark Streaming 是Spa ...
- RTSP RTSP(Real Time Streaming Protocol),RFC2326,实时流传输协议,是TCP/IP协议体系中的一个应用层协议
RTSP 编辑 RTSP(Real Time Streaming Protocol),RFC2326,实时流传输协议,是TCP/IP协议体系中的一个应用层协议,由哥伦比亚大学.网景和RealNetwo ...
- 关于 实时推送技术--WebSocket的 知识分享
今天学习了关于WebSocket的知识,觉得挺有用的,在这记录一下,也和大家分享一下!!有兴趣的可以看看哦 WebSocket简介 Web领域的实时推送技术,也被称作Realtime技术.这种技术要达 ...
- Kafka 在行动:7步实现从RDBMS到Hadoop的实时流传输
原文:https://coyee.com/article/11095-kafka-in-action-7-steps-to-real-time-streaming-from-rdbms-to-hado ...
- WEB 实时推送技术的总结
前言 随着 Web 的发展,用户对于 Web 的实时推送要求也越来越高 ,比如,工业运行监控.Web 在线通讯.即时报价系统.在线游戏等,都需要将后台发生的变化主动地.实时地传送到浏览器端,而不需要用 ...
- 了不起的WebRTC:生态日趋完善,或将实时音视频技术白菜化
本文原文由声网WebRTC技术专家毛玉杰分享. 1.前言 有人说 2017 年是 WebRTC 的转折之年,2018 年将是 WebRTC 的爆发之年,这并非没有根据.就在去年(2017年),WebR ...
随机推荐
- git 安装方法
Windows上安装Git示例 在Windows上使用Git,可以从Git官网直接下载安装程序,(网速慢的同学请移步国内镜像),然后按默认选项安装即可. 安装完成后,在开始菜单里找到“Git”-> ...
- Oracle 使用TRUNCATE TABLE删除所有行
若要删除表中的所有行,则 TRUNCATE TABLE 语句是一种快速.有效的方法.TRUNCATE TABLE 与不含 WHERE 子句的 DELETE 语句类似.但是,TRUNCATE TABLE ...
- Jconsole 工具介绍和使用方法
http://chain.blog.163.com/blog/static/14084852320117934024410/ JConsole是一个基于JMX的GUI工具,JDK自带小工具 h ...
- 14:质数因子PrimeNum
14:题目描述 功能:输入一个正整数,按照从小到大的顺序输出它的所有质数的因子(如180的质数因子为2 2 3 3 5 ) 详细描述: 函数接口说明: public String getResult( ...
- aar格式
aar包是Android Library Project的二进制公布包. 文件的扩展名是aar,并且maven包类型也应该是aar. 只是这文件本身就是一个简单的zip文件.里面有例如以下的内容: / ...
- jquery中this和$(this)使用的地方
插件中this代表$('元素')选择器 on()函数中this代表单个元素,$(this)代表单个选择器 反正有时代表整体,有时代表单个,代表单个时可以用$(this)来把他变成jquery对象
- 读懂JVM垃圾收集日志
JVM垃圾收集搞懂原理很重要,但是连垃圾收集的日志都不懂,这tmd还分析个屁的问题啊,典型的空有理论知识,动手实践为零.本篇就来具体的学习一下JVM中的垃圾收集日志. 第一步,垃圾收集的选项 图1 J ...
- 过滤XSS的HTMLPurifier使用
什么是HTMLPurifier? 在php里解决XSS最简单的方法是使用htmlspecialchars转义xml实体,但对于需要使用xml的时候就搏手无策了. HTML Purifier是基于php ...
- hibernate3中session.get()与session.load()两个方法的区别?
1.发送sql的时机不同:load采用延迟加载技术,只有当真正去使用所查处的对象时,才会发送sql:get采用的是立即检索技术,当执行到get方法是就会立即发送sql. 2.返回的对象不同:load返 ...
- liunx 安装工具总结
1 下载相关文件,比如hadoop 2 解压文件 tar -zxcf xxx.tar.gz 3 mv xxx 到指定目录:通常安装到/usr/local 或者自己建个目录 /usr/develo ...