【Samza系列】实时计算Samza中文教程(二)——概念

    希望上一篇背景篇让大家对流式计算有了宏观的认识,本篇根据官网是介绍概念,先让我们看看有哪些东西呢?
    概念一:Streams
    Samza是处理流的。流则是由一系列不可变的一种相似类型的消息组成。举个例子,一个流可能是在一个网站上的所有点击,或者更新到一个特定数据库表的更新操作,或者是被一个服务或者事件数据生成所有日志信息。消息能够被加到另一个流之后或者从一个流中读取。一个流能有多个消费者,并且从一个流中读取不会删除消息(使得小心能够被广播给所有消费者)。另外消息可以有一个关联的key用来做分区,这个将在后面说明。

    Samza支持实现流抽取的可插拔系统:在kafka里,流是一个topic(话题),在数据库里我们可以通过消费从一个表里更新操作读取一个流;而在hadoop里我们可能跟踪在hdfs上的一个目录下的文件。

    概念二:Jobs
    Samza的jobs 是对一组输入流设置附加值转化成输出流的程序(见下图)。为了扩展流处理器的吞吐量,我们将任务拆分更小的并行单元:分区Partitions和任务tasks
                                                                               
 
    概念三:Partitions
    每个流都被分割成一个或多个分区,并且在流里的每一个分区都总是一个有序的消息序列。每个消息在这个序列里有一个被叫做offset(中文暂且称它为偏移量吧),它在每一个分区里都是唯一的。这个偏移量可以是一个连续的整数、字节偏移量或者字符串,这取决于底层的系统实现了。
    当有一个消息加入到流中,它只会追加到流的分区中的一个。这个消息通过写入者带着一个被选择的key分配到它对应的分区中。举个例子,如果用户id被用作key,那么所有和用户id相关的消息都应该追加到这个分区中。
                                                                
    概念四:Tasks
    一个job通过把他分割成多个任务Task进行扩展。任务作为job的并行单元,就好比上述提到的流中的分区。每个任务为每个job输入流消费来自一个分区的数据。
    按照消息的偏移,一个任务按序处理来自它的输入分区的消息。分区之间没有定义顺序,这就允许每一个任务独立执行。YARN调度器负责分发任务给一台机器,所以作为一个整体的工作job可以分配到多个机器并行执行。
    在一个job中任务的数量是由输入分区决定的(也就是说任务数目不能超过分区数目,否则就会存在没有输入的任务)。可是,你能改变分配给job的计算资源(比如内存、cpu核数等)去满足job的需要,可以参考下面关于container的介绍。
    另外一个值得注意的是分配给task的分区的任务绝不会改变:如果有一个任务在一台失效的机器上,这个task会被在其它地方重启,仍然会消费同一个流的分区。
                                                                      
 
    概念五:Dataflow Graphs
    我们能组合多个jobs去创建一个数据流图,其中节点表示包含数据的流,而边则是进行数据传输。这个组合纯粹是通过jobs作为输入和输出的流来完成。这些jobs也是解耦的:他们不需要基于相同的代码库,并且添加、删除或者重启一个下游任务不会影响上游的任务。
                                               【Samza系列】实时计算Samza中文教程(二)——概念_第1张图片                                                     
 
    概念六: Containers
    分区Partitions和任务tasks都是并行的逻辑单元——他们不会与特定的计算资源(cpu、内存、硬盘等)的分配相符合。Containers则是物理的并行单元,并且一个容器本质上是一个Unix进程。每个容器跑着一个或多个tasks。tasks的数量是从输入的分区数自动确定和固定下来的,但是容器的数量(cpu、内存资源)是在运行时用户设定的并且能在任何时刻改变。

    好了Samza的几个大的概念介绍完了,我们可以从宏观上看看Samza是什么样的,下一篇内容咱们来欣赏一下它的架构。

你可能感兴趣的:(实时计算,Samza,流式计算)