Samza概念
本页介绍了 Samza 的高级概念。
流
Samza 处理流。流由相似类型或类别的不可变消息组成。例如,流可以是网站上的所有点击,或特定数据库表的所有更新,或服务生成的所有日志,或任何其他类型的事件数据。消息可以附加到流或从流中读取。流可以具有任何数量的消费者,并且从流读取不会删除消息(因此每个消息被有效地广播给所有消费者)。消息可以可选地具有用于分区的关联密钥,我们将在一秒钟内讨论。
Samza 支持实现流抽象的可插拔系统:在 Kafka 中,一个流是一个主题,在数据库中,我们可以通过在 Hadoop 中消耗更新来读取流,我们可能会拖放 HDFS 中的文件目录。
工作
Samza 作业是对一组输入流执行逻辑变换以将输出消息附加到输出流集合的代码。
如果可扩展性不是一个问题,流和工作就是我们所需要的。然而,为了缩小流处理器的吞吐量,我们将流和作业分解成更小的并行单元:分区和任务。
分区
每个流被分解成一个或多个分区。流中的每个分区是完全有序的消息序列。
该序列中的每个消息都有一个称为偏移量的标识符,每个分区是唯一的。取决于底层的系统实现,偏移量可以是顺序整数,字节偏移量或字符串。
当一条消息附加到流中时,它只会附加到流的一个分区。消息分配到其分区是由写入器选择的一个关键字来完成的。例如,如果使用用户ID作为密钥,则可确保与特定用户相关的所有消息都在同一分区中。
任务
通过将作业分解成多个任务来缩放作业。该任务是任务并行的单位,就像分区到流。每个任务从每个作业的输入流的一个分区中消耗数据。
一个任务按照消息偏移的顺序来顺序处理每个输入分区的消息。分区之间没有定义的排序。这允许每个任务独立运行。YARN 调度程序将每个任务分配给一台机器,因此整个作业可以分布在许多机器上。
作业中的任务数量由输入分区的数量决定(不能比输入分区更多的任务,或没有输入的任务)。但是,您可以更改分配给作业的计算资源(内存量,CPU内核数量等)以满足作业的需要。请参见下面的容器说明。
分区到任务的分配永远不会改变:如果任务在失败的计算机上,则任务在别处重新启动,仍然占用相同的流分区。
数据流图
我们可以组合多个作业来创建数据流图,其中边是包含数据的流,并且节点是执行转换的作业。这个组合完全是通过作业作为输入和输出的流完成的。作业完全解耦:它们不需要在相同的代码库中实现,并且添加,删除或重新启动下游作业不会影响上游作业。
这些图表通常是非循环的,也就是说,数据通常不会通过其他作业流向自己。但是,如果需要,可以创建循环图。
集装箱
分区和任务都是并行性的逻辑单元,它们不对应于计算资源(CPU,内存,磁盘空间等)的任何特定分配。容器是物理并行的单元,容器本质上是 Unix 进程(或 Linux cgroup)。每个容器运行一个或多个任务。任务数量根据输入中的分区数量自动确定,并被固定,但容器数量(以及与它们相关联的 CPU 和内存资源)数量由用户在运行时指定,并且可以随时更改。
更多建议: