5种好用的流计算系统

在图数据流模型受到广泛关注之前,有几种流式计算工具兴起,并在一定程度上弥补了传统技术应对大规模复杂数据流的不足,其中包括Storm、Spark Streaming 、Samza、Flink以 及Kafka Stream。本文将分别简要介绍和分析这几种系统,而后总结分析这些系统对大规模复杂数据流处理的相对优势及其仍然存在的重要不足。


5种好用的流计算系统


(1)Storm

Storm是Twitter开源的一个流系统。在Storm初始化时,需要用户定义一个实时计算的框架,这个框架的结构其实是一个有向图,图中点是集群中的计算节点,而点与点之间的边则对应整体计算逻辑中数据的传输。这个图框架也被称为拓扑。在一个拓扑中,传输的数据单元是一系列不可修改的键值对(tuple),键值对从消息源(spout)点中输出,形成流数据,并传输 到消息处理者(bolt)点中进行计算,进而产出新的输出流,bolt输出流也可以传输给其他bolt节点,形成流水线式的计算处理流。

(2)Spark Streaming

流式Spark其实 是Spark核心应用程序编程接口(application programming interface,API)的一个扩展,其对流式处理的支持其实是将流数据分割成离散的多个小批量的RDD(RDD是Spark的数据单元)数据,然后再进行处理。这些小批量的数据被称为DStream(D为discretized,即离散化的意思)。DStream数据既可以被自定义的函数并发地处理,也可以在移动窗口的数据模型下进行计算。

(3)Samza

Samza系统处理的流数据单元实质是类型相同或相近的消息,这些消息在产生之后是不可修改的。新产生的消息将被追加到流中,而流中的消息也不断地被读取。每条消息可以有相应的键值,这些键值可以用来对流中的所有消息进行分割。Samza的工作过程是对一组输入流中的消息数据进行按需计算转换(或过滤),并将计算结果以消息数据的形式附加到输出流中。因此,Samza的运行工作负载可能包含多个工作组,工作组之间可能有流数据的依赖关系,进而将整体的Samza计算抽象成一个数据流图框架,其中点都是流式的消息,而消息之间的边则为完成消息逻辑转化的计算任务的工作组。


5种好用的流计算系统


(4)Flink

Flink是跟Storm比较相似的系统,其整个数据处理过程称为Stream Dataflow,既定的数据流动框架类似于Storm的拓扑。此外,Flink提取数据流的操作(source operator)、数据转换(map,aggregate)的操作(transformation operator)以及数据流输出的操作(sink operator)跟Storm架构中spout与bolt之间、bolt和bolt之间的数据流是高度对应的。两者比较大的区别在于容错机制。Flink的容错机制 是检查点(checkpoint),通过异步实现,并不会打断数据流,因此Flink的检查点的开启与关闭对吞吐量的影响很小。而Storm采用的是ACK机制,开销更大,而且对吞吐量的影响更明显。另外,Flink提供的API相对Storm的API来说更高级,而Storm的API则更基础。Storm的优势主要是具有比较成熟的社区支撑和经过较长期迭代之后的稳定性,目前Flink成熟度较低,仍有部分功能需要完善,如在线的动态资源调整等。

(5)Kafka Stream

Kafka Stream是Apache Kafka中的一个轻量级流式处理类库,用来支撑Kafka中存储数据的流式计算与分析,利用这个类库进行计算的结果既可以写回Kafka,也可以作为数据源向外输出。目前的流式计算系统基本都支持以Kafka Stream的输出作为数据源,如Storm的Kafka Spout。作为一个Java类库,Kafka Stream并不是一个系统,但却是讨论流计算的工具中不得不提的对象。它可以非常方便地嵌入任意Java应用中,也可以以任意方式打包和部署,除了Kafka之外,并没有任何外部依赖。同流计算系统相比,使用Kafka受到的逻辑限制较少,开发者能够更好地控制和使用Kafka Stream上的应用。

这些流系统和流计算库的核心思想都是针对流式的输入利用集群进行协作计算,而整体的数据依赖所形成的框架则为一个有向无环图,因此集群的整体协作更像是流水线的协作,计算框架中的数据依赖所形成的数据流动方向基本上是单一既定的。

除了数据处理的先后关系之外,这些流系统对不同工作组之间的数据的独立性要求往往更高,进而能实现较好的并行效果。

然而对于很多图计算而言,计算的逻辑并不是流水线式的流系统能容易处理的。图具有很强的表达能力,数据与数据之间的关联紧密,路径、连通分量等图计算使数据间的独立性比较低,单条边的变化可能对整个图的结构特征产生全局的影响。而且,图数据计算中的中间结果较多(如子图查询中的部分解),在分布式集群下的传输代价很高。因此,流式系统往往难以支撑大规模图数据流的计算。


分享到:


相關文章: