本文是作者在充分阅读和理解Yahoo!最新发布的技术论文《
S4是Yahoo!在2010年10月开源的一套通用、分布式、
开发动机
“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系统,主要是为了解决它现实的问题:
“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系统主要解决的是对静态数据的批量处理,
而流式计算系统在启动时,一般数据并没有完全到位,
当然,现在也有很多基于Hadoop系统来处理流式数据。
- Micro-batchinMapReduce:
就是把流式的数据按照时间或者大小形成小的静态数据, 然后定期启动MapReduce来计算。 - Continuous MapReduce:Hadoop Online(http://www.eecs.
berkeley.edu/Pubs/TechRpts/ 2009/EECS-2009-136.html) 通过实现作业内的数据传输Pipeline和作业间的数据传输P ipeline,可以实现online aggregation和continuous queries。当前MapReduce模型中, 只有Map中间结果完全产生后,Reduce才会过来拖数据, 等所有Map数据都拖成功后,才能计算。Hadoop Online实现了Map到Reduce间的数据Pipelin e,使得可以在Map产生部分数据后, 就可以送到Reduce端, 以便Reduce可以提前或者定期计算。 - Dynamic add input:百度的一种实现,
用来解决计算时数据还没有到位的问题。 作业可以在数据还没有完全到位的情况下启动, 当新数据累积到一定量时,通过一个命令行接口, 向运行中的作业动态增加新的输入。通过这种方式, 大大减少了处理大数据作业时等待数据到位的时间, 在依次执行多个作业时,也会有时间收益。
在论文中,对类似于第一种的方式,分析了它的缺点。
随着大量实时应用的发展,比如实时搜索、实时交易系统、
设计假设和目标
为了简化设计,S4给出了下面的假设。
Lossy failover is acceptable,即一旦一个节点失败,
节点不能动态增加和减少。
设计目标包括以下几个方面。
- 简单的编程接口。
- 高可用+高可扩展。
- 尽力避免Disk IO,而要尽量使用Local Memory,以便减少处理latency。
- 使用去中心化和对称架构,所有的节点的责任相同,
方便部署和维护。 - 功能可插拔,使得平台通用化的同时,做到可以定制化。
- 设计要科学、易用和灵活。
S4的设计大量借鉴了I BM的Stream Processing Core(SPC)中间件的设计。只是 SPC采用的是Subscription Model,而S4结合了 MapReduce和Actors Model。
Event Stream
一个Stream是Events的序列流。
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中的基本运算单元。
- functionality:
实现PE的Java类和相关配置来定义。 - types of events:处理的event type。
- key:关心哪种key。
- Key的值:关心的key值是多少。
每个PE只负责处理自己所关心的eventtype,
在图1中,PE2负责处理相应的单词事件(WordEvent)
有一类特殊的PE,即keylessPE(
PE的逻辑主要由应用程序员来开发。
Processing Node
Processing Node是一个逻辑节点,负责监听消息的到来,对消息进行处理,
通过图2的设计,可以保证,对应于相同event type,
底下的Communication Layer和Zookeeper共同完成了集群管理和自动fai
编程模型
应用的主要任务就是实现一些相应的PE。
- processEvent():用来处理每一个event,
然后修改相应的内部状态。 - output():框架会按照应用的配置定期的调用,
以便向下游输出其他event。应用可以使用两种输出配置, 一个是隔多长时间输出一次; 另一个是隔多少event个数输出一次。
其他
论文中给出了一个Word Count的例子,大家可以仔细研究一下。在性能测试部分,
随着大量实时计算需求的增加,
作者简介
马如悦,百度基础架构部高级工程师,自2007年加入百度,
(本文来自《程序员》杂志11年01期,