现如今,实时或近实时处理大数据的分布式计算系统的确有不少。本文对来自Apache的三个处理框架进行一个简短的描述,并从整体上对它们进行快速的比较,了解它们的相似和差异点。 Apache Storm 在Storm中,用户需设计一个实时计算图,即拓扑(Topology),并将其部署到集群上。Storm集群的主节点会将代码分发至工作节点来执行该拓扑。
在一个拓扑之中,数据流以只读Key-Value对集合的形式存在,称之为元组(Tuple),数据流通过Spout形成元组,Bolt对元组进行变换(如聚合、过滤等)。另外, Bolt可以串联起来,以处理流水线的形式将数据传递到下一个Bolt。 Apache ……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属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项目,本文仅作浅尝辄止。并未对它们的大量特性和不同之处做进一步描述。不过,一定要记得上面的比较是有局限性的,因为这些系统会一直演化和进步。
翻译
相关推荐
-
Cloudera-Hortonworks合并或将减少Hadoop用户的选择
近日大数据领域两家顶级供应商达成交易协议,这可能会影响Hadoop和其他开源数据处理框架,并使大数据用户的技术 […]
-
采矿设备制造商利用BI on Hadoop来挖掘数据
如果大数据要取得巨大成功,则需要提供给更多的最终用户群组。但广泛使用的商业智能工具尚不能轻松分析最大的大数据, […]
-
新Qlik Sense功能可用于云计算、AI和大数据
一年前,Qlik公司公布其长期计划,即将高级云计算、AI和大数据功能添加到其自助式BI和数据可视化软件中。现在 […]
-
Cambridge Analytica秘密收集Facebook数据表明对道德数据挖掘的需求
当有关Cambridge Analytica公司秘密收集Facebook数据的消息传出时,这暴露了一个薄弱环节 […]