Samza 协调器流

2018-08-22 17:48 更新

Samza 的工作完全由工作配置驱动。因此,工作配置往往相当大。为了轻松地序列化这样大的配置并将其持续执行,Samza 在提交作业时将所有配置写入一个称为协调器流的持久流。

协调器流是配置被写入的单分区流。它具有与 Samza 中可配置的任何输入流相同的特征 - 有序,可重放和容错。流将包含三种主要类型的消息:

  1. 作业配置消息
  2. 任务 changelog 分区分配消息
  3. 集装箱地点信息

协调器流命名

命名约定与创建的检查点主题非常相似。

"__samza_coordinator_%s_%s" format (jobName.replaceAll("_", "-"), jobId.replaceAll("_", "-"))

协调器流消息模型

协调器流消息被建模为键/值对。关键是明确定义的字段列表:版本,类型和密钥。该值是一张地图。值映射有一些预定义字段(如时间戳,主机等),这些字段对所有消息都是通用的。

CoordinatorStreamMessage 的完整结构是:

key => ["<version-number>", "<message-type>", "<key>"]

message => {
    "host": "<hostname>",
    "username": "<username>",
    "source": "<source-for-this-message>",
    "timestamp": <timestamp-of-the-message>,
    "values": { }
}

消息本质上是串行化的,并通过电线作为 JSON Blob 发送。因此,为了使序列化正常工作,没有任何不必要的空格是非常重要的。上述 JSON blob 中的空白区域仅显示为可读性。

最重要的字段是类型,键值和值:

  • type - 定义消息的种类
  • 键 - 定义与值相关联的键
  • 值映射 - 基于每个消息类型定义,并定义与该类型相关联的一组值

当前支持的协调器流消息如下所示:

信息类型价值观地图
配置消息
(适用于所有构型
中列出的选项的配置
设置配置<配置名称>'value'=> <config-value>
任务 - 更改日志分配消息设置更新日志TaskName >'partition'=> <Changelog-Partition-Id>
集装箱地点信息设置容器主机分配<容器-ID>'hostname'=> <HostName>

协调器流写入器

Samza 提供了一个命令行工具,将 Job Configuration 消息写入协调器流。该工具可以使用如下:

samza-example/target/bin/run-coordinator-stream-writer.sh \
  --config-path=file:///path/to/job/config.properties \
  --type set-config \
  --key job.container.count \
  --value 8

工作协调器

作业协调器每次在作业启动时从协调器流引导配置。它会定期跟踪写入协调器流的任何新数据,并更新作业模型。

作业模型是用于表示 Samza 作业的数据模型,它还包含作业配置。Samza 作业的层次结构具有容器,每个容器都有任务,封装在作业模型中,以及相关信息,如容器ID,任务名称,分区信息等。

作业协调器通过 HTTP 服务公开作业模型和作业配置。作业协调器的 HTTP 服务的 URL 作为环境变量作为容器启动时传递给 Samza Containers。容器可以编写元信息,例如 locality - 容器运行的机器的主机名。但是,他们将通过HTTP服务查询作业协调器来读取作业模型和配置。

因此,Job Coorindator 是具有整个工作状态的最新视图的单一组件。这是非常有用的,因为它允许我们在将来扩展作业协调器的功能来管理作业的生命周期(例如启动/停止容器,修改任务分配等)。

工作协调器可用性

作业协调器驻留在与 Samza 应用程序主机相同的容器中。因此,作业协调器的可用性与纱线群集中应用程序主机(AM)的可用性有关。只有在协调器流初始化工作协调器之后才能启动Samza 容器。在稳定状态下,当 Samza 容器出现时,应该能够从 Job Coordinator 中读取 JobModel,而不会超时。

协调器流模型的优点

将配置写入持久的流程为 Samza 打开了大门:

  1. 删除作业配置上的大小限制
  2. 使用标准数据模型和通信接口向工作容器提供与作业相关的配置和元数据(有关详细信息,请参阅作业协调器
  3. 某些配置只能设置一次。在将来的部署中更改它们将重置整个作业的状态,因为它可能会将输入分区重新洗牌到容器。例如,在有状态的Samza作业上更改SystemStreamPartitionGrouper会将单个更改日志分区中的不同StreamTask的状态混合起来。没有持续配置,没有简单的方法来检查作业的当前配置是否有效。
  4. 可以通过写入协调器流动态更改作业配置。这可以使需要作业的功能与配置更改(例如主机相关性,自动缩放,动态重新配置等)无关。
  5. 提供统一的工作状态视图,使Samza能够更强大的控制容器控制的方式(有关详细信息,请参阅作业协调器
  6. 使得 Job Coordinator 未来的设计失败,因为它作为当前工作状态的真实来源

对于可以利用此型号的其他有趣功能,请参考设计文档

事件循环 »

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号