Hadoop(2.x)云计算生态系统

Spark

开发者通常想看到是否有其他类似的系统可以做一个对比。我们会竭尽所能,拿其他系统的特征与samza的相关特性做一个对比。但我们不是这些系统的专家。我们的理解有可能完全失之偏颇。如果的确有的话,请让我们知道,我们会改正的。

spark stream 是使用apche spark API的流处理系统。无论Samza和Spark stream提供数据的一致性,容错,编程API等,但spark stream的方法和Samza是不同。

Samza收到消息的同时即刻处理,而spark stream是批量操作处理。spark stream 引入一个固定持续时间(如1秒),来进行批处理。每批数据流被表示为一个弹性分布式数据集(RDD)。这些RDDS的无序的序列被称为离散流(DSTREAM)。

Spark Streaming概述

再进比较之前,先讲一下Spark Streaming应用程序的简要概述。如果你已经熟悉Spark Streaming,你可以跳过这一部分。Spark Streaming流应用程序的主要包含两个主要部分:数据接收和数据处理。

数据接收:通过其接收数据并将数据存储在spark(虽然不是在一个RDD上)的接收器来完成的.

数据处理:将存储在spark中的数据送到如DSTREAM进行处理。那么你可以在DSTREAM申请这两个操作 ( 转换和输出操作 )

在这里将讲述一下Spark Streaming 的部署概述。在spark的driver program中有一个SparkContext对象(在SparkStreaming中,我们称作StreamingContext)。SparkContext与集群的manager交互(例如:yarn、memos),manager在spark应用应用程序中其他协调管控资源的角色。在Yarn的环境中,一个执行程序就相当于一个container。task就是从其中执行的程序。这行程序可以在本地执行也可以提交到集群中执行。数据的收集与数据的处理都是通过task任务完成的。一个收集者进程可能是长时间的执行的长任务,而处理者程序是批量执行的。

顺序性的保证

Spark Streaming 保证在DSTREAM里面的批次处理是 有序。在Spark Streaming中 ,消息确切的顺序并不重要。Spark Streaming 并不保障消息的最少一次或最多一次消息的处理方式。因为在某些情况下,当程序执行失败的时候,可能会丢失数据(见容错性)。另外,Spark Streaming,它是适合于确定性处理,比如随机机器学习算法。

Samza保证能够保障处理的消息的顺序性,是基于数据在kafka分区中的顺序性。 Samza提供了最少处理一次的消息传递保证。

状态管理

Spark Streaming 提供有状态的DStream,通过updateStateByKey方法,利用key值来保存状态。

每一次调用updateStateByKey() ,都会更新DStream,获得一个新的DStream的状态,将通过key-value的方式进行存储。但有几个缺点:

1) you can only apply the DStream operations to your state because essentially it’s a DStream.

2)不提供key-value的键值对访问,如果需要访问,需要遍历整个DSTREAM。

3)当stat的状态数据量过大的时候,这样的处理方式是低效的,因为更新一批状态数据需要处理整个DStream的状态。

分区与并行

Spark Streaming的并行性是是通过把job分成小任务,并将其送到执行者的方式实现。有两种并行类型的Spark Streaming:在接收端的并行性与在处理端的并行性。 在接收端,一个输入DSTREAM创建一个接收程序,和一个接收器接收数据并作为一个长期运行的任务运行一个输入流。 所以为了在接收过程中实现并行,您可以拆分一个输入流转换为基于一些标准多输入流(例如,如果您收到一个kafka流,这些流基于不同的分区,你可以在分区的基础上会拆分输入流)。 然后你就可以创建多个输入DStreams(多个接收器),这些流和接收器将并行运行多个任务。 因此,你应该通过增加执行者的核心数或运行更多的执行者并提供足够的资源。由于DSTREAM是RDDS的连续顺序中,并行是简单地通过正常的RDD操作,如map,reduceByKey,reduceByWindow来完成的。

Samza的并行性是通过分割不同的处理流程到独立的task中。您可以在一个容器中执行多个任务或一个容器只执行一个任务运行。具体如何选择主要看任务的工作量和可能等待时间的需求。例如,如果你想快速重新处理数据流,你可以增加容器的数量,并且每个容器只包含一项任务。 需要注意的是,一个容器只使用一个线程,每个线程映射到一个CPU是很重要的。这个设计试图简化资源管理和作业之间的隔离。

缓存与延时

Spark Streaming本质上是小批量处理的序列集合,并具有快速执行引擎,它可以达到低至1秒延迟(从他们的论文得知)。如果处理比接收慢,数据将被排队在DStreams的存储器,并且队列将不断增加。为了能够顺利的运行Spark Streaming应用,处理数据需要跟接收的速度类似。

samza通过与kafka整合,可以使延时降低至毫秒级别。他用了不同的方法处理延时。缓冲机制依赖于输入和输出系统。例如,使用kafka作为输入和输出系统时,数据实际缓冲到磁盘。这样的设计决策,虽然牺牲一点点性能延迟,使得可以利用缓冲区来吸收大量积压的信息,尤其是当数据的处理能力跟不上的时候。

容错性

在和Samza存在两种故障:在Spark Streaming里面的工作节点(运行执行者),在Samza相当于在容器失败和驱动器节点故障中(运行驱动程序)失败(相当于Samza中的应用程序管理器)的故障)。

在Spark Streaming中,当一个工作节点失败,它将通过集群管理器重新启动工作节点。在Samza中,当一个容器失败时,应用程序管理器将通过Yarn重新启动一个新的容器。

在Spark Streaming当驱动器节点失败,Spark的集群模式会自动重新启动驱动程序节点。但目前在yarn和Mesos的集群环境下还不能支持。您需要其他机制来自动重启动驱动程序节点。在Samza中,当AM失败后YARN将处理重新启动AM。如果AM重启,Samza将重新启动所有的容器实例。

在对丢失的数据的处理方式上面,有 Spark Streaming和Samza之间的是有差别的。

Samza在容器失败的时候是不会丢失数据,因为它具有检查点的概念,最新处理消息的存储的偏移量和处理数据后提交的检查点更新。

部署与执行

Spark Streaming 有SparkContext对象集群管理器,然后分配资源给应用程序。目前,Spark支持三种类型的群集管理器:Spark独立运行模式,apache Mesos和Hadoop的yarn。除了这些,Spark还可以运行在亚马逊EC2上面。

Samza只支持YARN或者本地环境下执行。

隔离性

Spark Streaming 和 Samza 具有相同的隔离性.

语言支持

Spark Streaming is written in Java and Scala and provides Scala, Java, and Python APIs. Samza is written in Java and Scala and has a Java API.

Spark Streaming是用Java和Scala编写,提供Scala,Java和Python的API的调用。 Samza也是通过Java和Scala编写。提供Java API接口调用。

成熟度

Spark 有一个活跃的用户和开发者社区,并在最近发布1.0.0版本。它使用它的技术网页的公司名单。Spark 包含星火流,Spark SQL,MLlib,GraphX和Bagel。

Samza还很年轻,但刚刚发布了0.7.0版本。它有一个负责任的社区,正在积极发展。这就是说,它是建立在坚实的系统智商,如yarn和kafka。 Samza被大量使用在LinkedIn,我们希望别人会发现它并应用。