您的位置:首页 > 运维架构 > Apache

【Apache Samza 系列】实时流数据处理框架Samza中文教程 (三)-- 概念

2015-02-12 16:14 483 查看

概念

本章介绍在Samza高层次的概念。

Streams(流)

Samza处理流。流则是由一系列不可变相似类型的消息组成。举个例子,一个流可能是网站所有的点击事件,或者到一个特定数据库的所有更新操作,或者一个服务产生的所有日志,或者其他类型的时间数据。消息可以附加到流或从流中读取。一个流可以拥有任意数量的消费者,且从一个流读取消息不能删除消息(所以每个消息能有效的广播到所有消费者)。消息可以选择具有相关联的key是用来划分,这点我们会在下面讲到。

Samza支持实现流抽象可插拔系统:在kafka中,一个流是一个topic;在数据库里我们可以通过消费从一个表里更新操作读取一个流;在Hadoop中,我们可能通过tail一个目录下的文件读取数据作为一个流。



Jobs

一个samza job是一组通过输入流附加输出消息来设置输出流的逻辑转换执行程序。如果扩展性不是一个问题,流和工作我们都需要。

然而,为了大规模的流处理器的吞吐量,我们将Streams和jobs切分成并行性更小的单元:partitions 和 tasks。

Partitions(分区)

每一个流是包含一个或者多个partition的broken。

在这个序列中的每个消息都有一个称为偏移的标识符,这是每个分区唯一的。该偏移可以是一个连续的整数,字节偏移,或字符串,这取决于底层系统实现。

当一个消息被添加到stream,它被添加到仅是一个stream的分区。writer通过选择的key将该消息分配到相应的分区。举个例子,如果以user ID作为key,那么所有和user ID相关的消息都应该追加到同一个分区中。



Tasks(任务)

一个job按比例被分解为多个task。task是job的并行单元,好比上面提到的流与分区的关系。每个task只从每个job输入流的一个分区消耗数据。

每一个任务处理的消息在分区的顺序中都有相应的偏移量作为记录,而分区与分区之间的顺序则未做定义。这样允许每个task独立运行。Yarn调度每个任务到相应的机器,所以job作为一个整体可以分布到多台机器上执行。

在一个job中,task的数量是由partition的数量决定的(task数目不能超过partition数目,否则就会存在没有输入的task,造成资源浪费)。然而,你可以改变分配给作业的计算资源(内存数量,数量的CPU内核,等)以满足工作的需要。看下面的containers部分。

分区的任务的分配永远不会改变:如果一个task在一台机器出现故障,task会在其他地方重新启动,还是消耗相同的stream partition。



Dataflow Graphs(数据流图)

我们可以组合多个job去创建一个Dataflow Graphs(数据流图),其中的节点流包含数据,并且边缘进行转换工作。这个组合纯粹是通过流作为输入和输出来工作的。Job之间是解耦的:他们不需要基于相同的代码库,并且添加、删除或者重启一个下游任务不会影响上游的任务。

这些图是无环的–数据不会通过一个任务到另一个任务,最后回到自己本身。然而,这也是有可能的,如果你需要创建环状图形。



Containers(容器)

partition(分区)和task(任务)都是并行的逻辑单元–他们不属于任何特定的分配计算资源(CPU,内存,磁盘空间,等)。Containers(容器)是一个并行的物理单元,实质上一个Unix进程(或者Linux cgroup。),每一个Containers(容器)运行一个或多个task。任务的数量是在输入分区的数量自动确定并固定,但容器的数量(和与它们相关联的CPU和内存资源)是在运行时由用户指定,可以在任何时间改变。

源英文文档URL:

http://samza.apache.org/learn/documentation/0.8/introduction/concepts.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐