大数据流计算之三S演义:Storm、Spark、Samza

日期: 2015-03-12 作者:TONY SICILIANI翻译:郭文超 来源:TechTarget中国

现如今,实时或近实时处理大数据的分布式计算系统的确有不少。本文对来自Apache的三个处理框架进行一个简短的描述,并从整体上对它们进行快速的比较,了解它们的相似和差异点。 Apache Storm 在Storm中,用户需设计一个实时计算图,即拓扑(Topology),并将其部署到集群上。Storm集群的主节点会将代码分发至工作节点来执行该拓扑。

在一个拓扑之中,数据流以只读Key-Value对集合的形式存在,称之为元组(Tuple),数据流通过Spout形成元组,Bolt对元组进行变换(如聚合、过滤等)。另外, Bolt可以串联起来,以处理流水线的形式将数据传递到下一个Bolt。 Apache ……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

现如今,实时或近实时处理大数据的分布式计算系统的确有不少。本文对来自Apache的三个处理框架进行一个简短的描述,并从整体上对它们进行快速的比较,了解它们的相似和差异点。

Apache Storm

在Storm中,用户需设计一个实时计算图,即拓扑(Topology),并将其部署到集群上。Storm集群的主节点会将代码分发至工作节点来执行该拓扑。在一个拓扑之中,数据流以只读Key-Value对集合的形式存在,称之为元组(Tuple),数据流通过Spout形成元组,Bolt对元组进行变换(如聚合、过滤等)。另外, Bolt可以串联起来,以处理流水线的形式将数据传递到下一个Bolt。

Apache Spark

Spark Streaming(一个基于Spark核心接口的扩展项目)并不是像Storm那样,一次处理一个数据流。取而代之地,Spark Streaming在处理前将数据流进行分片,按照时间间隔形成小的批处理任务。对于持续数据流的抽象,Spark称之为DStream(即Discretized Stream,离散数据流)。一个DStream是一个由RDD(ResilientDistributed Datasets,弹性分布式数据集)构成的微批处理任务。RDD是一个分布式集合,对其可以进行多种并行函数操作、指定时间窗口内的数据转换操作(窗口计算)等。

Apache Samza

Samza的流计算处理策略是,对接收到的消息逐一、即时处理。Samza的流计算原语并非是上文中提到的元组(Tuple)或离散数据流(DStream),而称之为消息(Message)。数据流被分成多个分片(Partition),每个分片是由多个只读消息构成的有序序列,其中每条消息会有一个唯一标识,即偏移量(Offset)。Samza同样支持批处理任务(Batching),比如对同一个数据流分片中的若干条消息进行消费。Samza的执行引擎和流处理模块均是插件化可插拔的,Samza通常依赖于Hadoop的YARN(Yet Another Resource Negotiator,另一个资源协调器)组件和Apache Kafka项目。

共同点

以上三种实时计算系统均是开源、低延迟、分布式、可扩展以及容错的。它们具有并行执行流处理任务的功能,并将任务分布到计算集群中,提供故障切换的能力。而且,他们均提供简单接口,对底层复杂的实现进行了抽象和封装。

三个框架使用了不同的术语来描述类似的概念:

Apache

Storm

Spark

Samza

流式数据数据源(S)

Spouts

Receivers

Consumers

流式数据原语(P)

Tuple

DStream

Message

流计算(C)

Bolts

变换(Tranformations)

窗口操作(Window Operations)

任务(Tasks)

对比

下表总结了三个系统的一些不同点:

Apache

Storm

Spark

Samza

送达语义

至少送达一次(使用Trident接口能实现精确一次)

有且只有一次(某些发生故障的场景除外)

至少送达一次

状态管理

无状态管理(自行实现或使用Trident接口)

有状态管理(将状态持久化到存储中)

有状态管理(内置Key-Value存储)

延迟

亚秒级

秒级(依赖于批处理大小)

亚秒级

语言支持

JVM语言,Ruby,Python,Javascript,Perl

 

Scala,Java,Python

仅支持JVM语言(如Scala,Java)

关于送达模式,通常有以下三类:

1.   至多送达一次:消息可能丢失。这通常不是想要的结果。

2.   至少送达一次:消息可能会被多次投递(无丢失,但可能重复)。对于许多应用场景不错。

3.   有且只有一次:每条消息只会投递一次(无丢失,无重复)。这是一个理想的结果,但很多场景均难以保证。

需要注意的另一方面是关于状态管理(state management)的。对于状态的存储是有不同策略的。Spark Streaming将数据写到分布式文件系统上(如HDFS)。Samza使用内置的Key-Value存储。而Storm,则要么在用户应用层对自身的状态进行管理,要么使用更高的接口抽象即Trident。

用例

以上三种框架均是高效处理持续化、海量实时数据的不错之选。三者选其一怎么选呢?这并无定规,有几条意见仅供参考。

如果你想要一个能够支持增量计算的高速事件处理系统,Storm是不错的选择。如果你的进一步需求是按需进行分布式计算,而客户端会同步等待结果的返回,那么分布式RPC(RPC)开箱即用,效果不错。最后一条也是重要的一条是Storm使用了Apache Thrift库,你可以使用任何语言来写拓扑。如果你需要对状态进行持久化或者要求有且只有一次的送达保证,那么就看一看更高层次的接口Trident,该接口提供微批处理(micro-batching)的功能。

使用Storm框架的公司有:Twitter,雅虎,Spotify,The Weather Channel等。

提到微批处理,如果你要求内置状态管理的计算、有且只有一次的送达保证、并不在意稍微高一些的延迟,那么应当考虑Spark Streaming。尤其是你打算做图计算、机器学习或使用SQL接口,Spark Streaming是不错的选择。Apache Spark软件栈支持将流计算与多种库(如Spark SQL、MLlib、GraphX)结合,并提供方便统一的编程模型。有必要指出的一点是流计算算法(如K-means算法)能够使用Spark实时地加速决策。

使用Spark的公司有:亚马逊,雅虎,NASA JPL,eBay,百度等。

如果你有大量的状态需要处理(如每个分片多达几个GB),Samza能够将存储和处理尽可能的集中到同一机器上,进而允许即使在状态超出内存的情况下也能正常工作。该框架还提供可插拔的API以提高其灵活性:其默认的执行引擎、消息队列和存储引擎均可被按照用户想法进行替换。此外,如果你的应用场景是不同的团队使用不同的代码来处理大量的数据,Samza的粗粒度任务特性则特别适合,因为他们可以在连锁反应最小化的前提下进行添加或删除。

使用Samza的公司有:LinkedIn,Intuit,Metamarkets,Quantiply,Fortscale等。

结语

对于三个顶级的Apache项目,本文仅作浅尝辄止。并未对它们的大量特性和不同之处做进一步描述。不过,一定要记得上面的比较是有局限性的,因为这些系统会一直演化和进步。

 

 

相关推荐