最近读了一下Yahoo!关于S4的论文 S4: Distributed Stream Computing Platform,随便做点笔记,欢迎大家批评指正:
首先是流计算的应用场景,亦即为什么我们需要流计算。作为商业搜索引擎提供商的Yahoo!广告的收益占其收入的很大一部分,而广告收入的计费方式是“cost-per-click”,也就是按点击次数计费。所以,Yahho!需要在每个搜索结果的页面上提供最相关的广告,而广告与用户搜索结果的相关程度是由用户的喜好,用户的地理位置(国家,地区),用户之前的搜索关键词以及用户之前的点击等等决定的。所以如何实时的根据的以上信息在用户的下一次搜索中提供最相关的广告就需要对不断到来的用户请求进行处理,也就是流处理,因为数据时不断地“流”进来的,而不是静态的。
正因为数据是“流”进来的,所以现在大热的基于批处理(batch processing)的Hadoop平台不能胜任这种工作,所以Yahoo!开发了S4,S4是简单可扩展流系统(Simple Scalable Stream System)的简称。
S4把流看成是一系列“事件”(element)的序列,每个事件的形式为(K,A),有点类似于MapReduce的键值对。
S4的基本计算单元是PE(Processing Element),每个PE由以下四部分来标示(Identify):函数,用来对数据进行处理计算;可接受的事件类型;可接受的事件类型的主属性(keyed attribute);实际接受的事件类型的主属性的值。这里第三条和第四条可能有点绕,举个WordCount的例子吧:假设有一种PE用来计算单词的数量(很类似于在MapReduce架构中做WordCount的Reduce),PE1和PE2都是这种PE。事件形式为(word,count)。PE1和PE2的函数就是对单词的count执行加法操作,接受的事件类型是(word,count),接受的事件类型的主属性是word,PE1实际接收的事件类型的主属性的值是“hello”,PE2实际接收的事件类型的主属性的值是“world”。
有一种特殊的PE是无键(keyless)PE,亦即这种PE会接受所有其可接受的事件类型。拿WordCount的例子来说就是对于所有的单词w,该PE都接受事件(w,count)。聪明的你一定会觉得这有点像MapReduce中的Map。其实我觉得总体上看S4的PE就是MapReduce中的Map或者Reduce,只不过MapReduce中输入数据是静态的,成批的,而S4中数据是“流入”的。
之前俄亥俄州立大学的张晓东有一篇论文DOT: A Matrix Model for Analyzing, Optimizing and Deploying Software for Big Data Analysis in Distributed Systems.就曾经说过MapReduce和Dryad本质上都是一样的,都可归结于DOT模型,那么S4其实也可以归结于DOT模型,只是数据的输入形式有所不同。
PN(Processing Node)是PE的逻辑主机,一个PN上可以有多个PE。PN的作用是监听到来的事件,在到来的事件上执行操作,在通信层的帮助下分发事件(到不同的PE)以及发送事件。每个有键的PE都会map到一个PN上,无键(keyless)PE会map到所有的PN上。
通信层的功能有集群管理,自动故障恢复(将任务分配给备用节点)以及物理节点到逻辑节点的映射。上面提到的PN仅仅是逻辑节点,其真正的物理节点是由通信层来进行映射的,亦即提供了物理位置的透明性,这样对于故障恢复是非常有帮助的。