✨ 有很多分布式计算系统可以实时或接近实时地处理大数据。本文将从三个Apache框架的简短描述开始,并试图对它们的异同点提供快速、高层次的概述。
▚ 01 Apache Storm
在Storm中,你可以设计一个称为拓扑结构topology
的实时计算图,并将其提交给集群,其中主节点master node
负责分发任务,工作节点worker nodes
负责执行。在拓扑结构中,数据在spouts
(发送表现为元数组tuples
形式的数据流,元数组是指不可边的键值对key-value pairs
)和bolts
(转换数据流,比如计数count
、过滤filter
等)间传递。bolts
本身可以在处理管道processing pipeline
中,有选择地向其他bolts
发送数据。
▚ 02 Apache Spark
Spark Structured Streaming | Apache Spark
Spark Streaming(Spark核心API的拓展)并不像Storm那种(每次只处理一个),且支持连续的数据流处理。相反,它在处理前先将其划分为小批量small batches
的时间间隔time intervels
。Spark对连续数据流的抽象称为DStream
(离散流Discretized Stream
)。DStream
为RDDs(弹性分布式数据集Resilient Distributed Datasets
)的微批量micro-batche
。RDDs是分布式集合,可以通过任意函数和数据滑动窗口的转换来并行操作。
2.1 Spark Streaming的工作原理
它首先将固定的时间间隔的数据流作为一个DStream,并形成DStreams,内部为一系列的RDDs。通过Spark API处理RDDs,并批量返回RDDs的操作结果。
整体的处理框架为:
▚ 03 Apache Smaza
分布式流处理框架A distributed stream processing framework
。
Samza的流处理方法是在接收到信息时,每次处理一个信息。Samza的流原语不是元组或者DStream,而是一个消息message
。流被划分为分区partitions
,每个分区是一个有序的只读消息序列,每个消息拥有一个唯一的ID(偏移量offset
)。该系统还支持批处理,即从相同的流分区顺序消费多个消息。尽管Samza通常依赖Hadoop的YARN(Yet Another Resource Negotiator
)和Apache Kafka。
▚ 04 对比分析
4.1 相同点
这三种实时计算系统都是开源、低延迟、分布式、可扩展和容错的。它们都允许分布在具有故障转移功能的计算机集群上的并行任务来运行流处理代码。也提供了简单的API来抽象底层实现的复杂度。
这三个框架对类似的概念使用了不同的词汇表:
4.2 差异点
有三种传递模式:
-
At-most-once:消息可能会丢失。这通常是最不理想的结果。
-
At-least-once:消息可能被重新传递(没有丢失,但是会重复)。这对许多用例来说已经足够了。
-
Exactly-once:每个消息传递一次且仅传递一次(没有丢失,没有重复)。这是个理想的特性,尽管很难在所有情况下保证。
这三种框架的不同点,如下表所示:
另一个方面是状态管理。它们使用不同的策略来存储状态。Spark Streaming将数据写入分布式文件系统(如HDFS)。Samza使用嵌入的键值对key-value
存储。Storm可在应用层管理状态,或使用一个称为trident
的更高层抽象。
▚ 05 小结
上文仅初步了解了3中Apache框架,并没有详细介绍这些框架间的许多其他特性和更细微的差异。由于这些系统是不断演化的,因此,理解它们比较的局限性是重要的。
参考文章:
Streaming Big Data: Storm, Spark and Samza - Java Code Geeks - 2022