本文是作者在充分阅读和理解Yahoo!最新发布的技术论文《S4:Distributed Stream Computing Platform》的基础上,所做出的知识分享。

S4是Yahoo!在2010年10月开源的一套通用、分布式、可扩展、部分容错、具备可插拔功能的平台。这套平台主要是为了方便开发者开发处理流式数据(continuous unbounded streams of data)的应用。项目官方网站为:http://s4.io/。同时,S4的开发者也发表了一篇技术论文《S4:Distributed Stream Computing Platform》来介绍S4的设计。下面我们就来学习这篇论文。

开发动机

“We designed this engine to solve real-world problems in the context of search applications that use data mining and machine learning algorithms.” … “To process user feedback, we developed S4, a low latency, scalable stream processing engine.”

Yahoo!之所以开发S4系统,主要是为了解决它现实的问题:搜索广告的展现。搜索广告是当前各大搜索引擎的主要收入来源,用户发出查询请求,搜索引擎在返回正常结果的同时也会返回相关广告,而广告是按照点击付费。为了在最好的位置,放置最相关(也就是用户最有可能点击)的广告,各大搜索引擎使用了大量的数据挖掘和机器学习算法来进行相关性计算,以便提高收入,满足用户需求。其中很重要的一点就是要不断分析用户的点击反馈,以便捕获用户的行为。S4最初主要还只是用来处理用户的点击反馈。

“The streaming paradigm dictates a very different architecture than the one used in batch processing. Attempting to build a general- purpose platform for both batch and stream computing would result in a highly complex system that may end up not being optimal for either task.”

那么Yahoo!为什么没有选择Hadoop来处理呢? MapReduce系统主要解决的是对静态数据的批量处理,即当前的MapReduce系统实现启动计算时,一般数据已经到位了(比如保存到了分布式文件系统上)。

而流式计算系统在启动时,一般数据并没有完全到位,而是源源不断地流入,并且不像批处理系统重视的是总数据处理的吞吐,而是对数据处理的latency,即希望进入的数据越快处理越好。

当然,现在也有很多基于Hadoop系统来处理流式数据。一般有以下几种方式。

  • Micro-batchinMapReduce:就是把流式的数据按照时间或者大小形成小的静态数据,然后定期启动MapReduce来计算。
  • Continuous MapReduce:Hadoop Online(http://www.eecs.berkeley.edu/Pubs/TechRpts/2009/EECS-2009-136.html)通过实现作业内的数据传输Pipeline和作业间的数据传输Pipeline,可以实现online aggregation和continuous queries。当前MapReduce模型中,只有Map中间结果完全产生后,Reduce才会过来拖数据,等所有Map数据都拖成功后,才能计算。Hadoop Online实现了Map到Reduce间的数据Pipeline,使得可以在Map产生部分数据后,就可以送到Reduce端,以便Reduce可以提前或者定期计算。
  • Dynamic add input:百度的一种实现,用来解决计算时数据还没有到位的问题。作业可以在数据还没有完全到位的情况下启动,当新数据累积到一定量时,通过一个命令行接口,向运行中的作业动态增加新的输入。通过这种方式,大大减少了处理大数据作业时等待数据到位的时间,在依次执行多个作业时,也会有时间收益。

在论文中,对类似于第一种的方式,分析了它的缺点。如果将数据流切成较小的data segment,就会增加启动作业的overhead,同时使得维护segment之间的依赖关系变得更加复杂;但如果切得较大,那么处理的latency就会比较长。

随着大量实时应用的发展,比如实时搜索、实时交易系统、实时欺骗分析、实时监控、社交网络等,都需要一个高度可扩展的流式计算解决方案。不同于原来的流式计算系统,S4主要解决的是高数据率和大数据量的流式处理。

设计假设和目标

为了简化设计,S4给出了下面的假设。

Lossy failover is acceptable,即一旦一个节点失败,会failover到另一个standby节点,但是会丢失原节点的内存状态。这也是为什么说S4是一个部分容错的系统。

节点不能动态增加和减少。

设计目标包括以下几个方面。

  • 简单的编程接口。
  • 高可用+高可扩展。
  • 尽力避免Disk IO,而要尽量使用Local Memory,以便减少处理latency。
  • 使用去中心化和对称架构,所有的节点的责任相同,方便部署和维护。
  • 功能可插拔,使得平台通用化的同时,做到可以定制化。
  • 设计要科学、易用和灵活。

S4的设计大量借鉴了I BM的Stream Processing Core(SPC)中间件的设计。只是 SPC采用的是Subscription Model,而S4结合了 MapReduce和Actors Model。

Event Stream

一个Stream是Events的序列流。每个Event是一个(K,A)数据,通过EventType来标示其类型。K、A分别表示这种类型的Event的keys和attributes。key和attribute都是tuple-valued,即key=value这种元组值。下面给出一个event的例子:

EV:ClickLog                         → event type

KEY:product=“search”, type=”online”

→ keys

VAL: userid=”123”, ip=”10.0.0.0”,

cookieid=”3”                            → attributes

Processing Elements

Processing Element(PE)是S4中的基本运算单元。一个PE通过下面四个组件来表示。

  • functionality:实现PE的Java类和相关配置来定义。
  • types of events:处理的event type。
  • key:关心哪种key。
  • Key的值:关心的key值是多少。

每个PE只负责处理自己所关心的eventtype,并且只处理自己所对应的key值的event。PE处理后可能输出一个或多个event。当平台处理一个key值时,会先检查相应的PE是否已经存在,如果不存在,会先初始化相应的PE,然后交由这个PE进行处理。举例如图1所示。

在图1中,PE2负责处理相应的单词事件(WordEvent),主要逻辑是统计所关心单词的个数,然后输出给下游的PE。PE2所关心的eventtype为WorkEvent,所关心的key为word,所关心的key值为“said”。假如又来了一个WordEvent,key为word=“listen”,那么这个事件就不是PE2所关心的,所以平台可能会为“listen”值启动一个新的PE来处理。

有一类特殊的PE,即keylessPE(没有key和key值),这些PE会接收相应eventtype的所有event进行处理。这类PE主要用来作为S4cluster的输入层(InputLayer),即外围应用会产生相应的event(keylessevent),将这些event发到任何一个节点。而S4cluster中的每个节点都会启动一个keylessPE,这些PE做简单的输入处理后,转化为keyedevent,交给集群中的其他PE类型进行处理。

PE的逻辑主要由应用程序员来开发。

Processing Node

Processing Node是一个逻辑节点,负责监听消息的到来,对消息进行处理,然后通过Communication Layer将event在集群中分发。S4主要依据上面提到的eventtype和key/key值,对key值求hash,在集群中进行分发。关注的key集合通过配置文件来得到。对于需要处理的event,会交给PN中的Processing Element Container(PEC),然后PEC调用相应的PE进行处理。PN功能框如图2所示。

通过图2的设计,可以保证,对应于相同event type,key和key值的event一定会被路由到对应的PN。

底下的Communication Layer和Zookeeper共同完成了集群管理和自动failover功能。

编程模型

应用的主要任务就是实现一些相应的PE。PE一般提供如下接口供应用实现。

  • processEvent():用来处理每一个event,然后修改相应的内部状态。
  • output():框架会按照应用的配置定期的调用,以便向下游输出其他event。应用可以使用两种输出配置,一个是隔多长时间输出一次;另一个是隔多少event个数输出一次。

其他

论文中给出了一个Word Count的例子,大家可以仔细研究一下。在性能测试部分,论文总结了将S4应用到实际的CTR(Click-Through Rate)预估中的效果。在应用举例中,给出了S4在在线参数优化的应用。

随着大量实时计算需求的增加,分布式流式计算将会成为分布式计算的下一个主要研究重点,将会成为类似Hadoop这类MapReduce框架的有力补充。这一方向的工作还处在初级发展阶段,大家需要多加关注。

作者简介

马如悦,百度基础架构部高级工程师,自2007年加入百度,一直从事分布式存储系统和分布式计算系统的设计和开发工作。对Hadoop有较深入的研究,一直积极活动在Hadoop开源社区。

(本文来自《程序员》杂志11年01期,更多精彩内容敬请关注01期杂志)

分布式流式计算平台——S4的更多相关文章

  1. 搜索广告与广告网络Demand技术-流式计算平台

    流式计算平台-Storm 我们以Storm为例来看流式计算的功能是什么. 下面内容引用自大圆的博客.在Storm中,一个实时应用的计算任务被打包作为Topology发布,这同Hadoop的MapRed ...

  2. Storm:分布式流式计算框架

    Storm是一个分布式的.高容错的实时计算系统.Storm适用的场景: Storm可以用来用来处理源源不断的消息,并将处理之后的结果保存到持久化介质中. 由于Storm的处理组件都是分布式的,而且处理 ...

  3. Flink 另外一个分布式流式和批量数据处理的开源平台

    Apache Flink是一个分布式流式和批量数据处理的开源平台. Flink的核心是一个流式数据流动引擎,它为数据流上面的分布式计算提供数据分发.通讯.容错.Flink包括几个使用 Flink引擎创 ...

  4. Others-阿里专家强琦:流式计算的系统设计和实现

    阿里专家强琦:流式计算的系统设计和实现 更多深度文章,请关注云计算频道:https://yq.aliyun.com/cloud 阿里云数据事业部强琦为大家带来题为“流式计算的系统设计与实现”的演讲,本 ...

  5. 大数据入门第十六天——流式计算之storm详解(一)入门与集群安装

    一.概述 今天起就正式进入了流式计算.这里先解释一下流式计算的概念 离线计算 离线计算:批量获取数据.批量传输数据.周期性批量计算数据.数据展示 代表技术:Sqoop批量导入数据.HDFS批量存储数据 ...

  6. 流式计算(二)-Kafka Stream

    前面说了Java8的流,这里还说流处理,既然是流,比如水流车流,肯定得有流的源头,源可以有多种,可以自建,也可以从应用端获取,今天就拿非常经典的Kafka做源头来说事,比如要来一套应用日志实时分析框架 ...

  7. 分布式流式处理框架:storm简介 + Storm术语解释

    简介: Storm是一个免费开源.分布式.高容错的实时计算系统.它与其他大数据解决方案的不同之处在于它的处理方式.Hadoop 在本质上是一个批处理系统,数据被引入 Hadoop 文件系统 (HDFS ...

  8. 流式计算与计算抽象化------《Designing Data-Intensive Applications》读书笔记15

    上篇的内容,我们探讨了分布式计算中的MapReduce与批处理.所以本篇我们将继续探索分布式计算优化的相关细节,并且分析MapReduce与批处理的局限性,看看流式计算是否能给我们在分布式计算层面提供 ...

  9. Apache Beam—透视Google统一流式计算的野心

    Google是最早实践大数据的公司,目前大数据繁荣的生态很大一部分都要归功于Google最早的几篇论文,这几篇论文早就了以Hadoop为开端的整个开源大数据生态,但是很可惜的是Google内部的这些系 ...

随机推荐

  1. java构造函数是否可继承,以及子类构造函数可否不使用super调用超类构造函数

    问题一:java的构造函数能否被继承? 笔者初学java看的一本书说:“java的子类自然的继承其超类的“非private成员”. 通常java的构造函数被设置为public的(若你不写构造函数,ja ...

  2. JSP Servlet之间交换数据

    摘自:<轻量级Java EE企业应用实战>第三版 对于每次客户端请求而言,web服务器大致需要完成以下步骤: 1.启动单独线程 2.使用I/O流读取用户的请求参数 3.从请求数据中解析参数 ...

  3. 第七章 : Git 介绍 (下)[Learn Android Studio 汉化教程]

    Learn Android Studio 汉化教程 Let’s reset even further to remove all traces of your work on the deprecat ...

  4. selenium webdriver——JS操作日历控件

    一般的日期控件都是input标签下弹出来的,如果使用webdriver 去设置日期, 1. 定位到该input 2. 使用sendKeys 方法 比如 但是,有的日期控件是readonly的 比如12 ...

  5. requests接口测试——身份认证

    当调用者访问接口时需要进行用户认证(用户名密码的登录),只有通过了认证才允许调用者访问接口. 1.基本身份认证 许多要求身份认证的web服务都接受HTTP Basic Auth.这是最简单的一种身份认 ...

  6. vue组件化开发实践

    前言 公司目前制作一个H5活动,特别是有一定统一结构的活动,都要码一个重复的轮子.后来接到一个基于模板的活动设计系统的需求,便有了一下的内容.首先会对使用Vue进行开发的一些前期需要的技术储备进行简单 ...

  7. Httpservlet源码说明

    上一篇看了Servlet接口,现在来看下我们经常涉及的Httpservlet: /** * * Provides an abstract class to be subclassed to creat ...

  8. 「小程序JAVA实战」小程序视频组件与api介绍(51)

    转自:https://idig8.com/2018/09/22/xiaochengxujavashizhanxiaochengxushipinzujianyuapijieshao50/ 这次说下,小程 ...

  9. Struts 2 常用技术

    目录  Struts 2 常用技术  1. 常用类和接口  1.1 getter 和 setter 方法  1.2 Action 接口  1.3 ActionSupport 类  1.4 通过 Act ...

  10. du熊的机器人

    [du熊的机器人] Description du熊正在玩一个别人刚送给它的机器人.这个机器人只能在一个棋盘中行走,棋盘的左上角格子为(0, 0),右下角格子为(X, Y). du熊控制这个机器人从棋盘 ...