Flink 中的算子是什么?操作员状态和键控状态有何不同?

Sha*_*dra 2 apache-flink

根据我的理解,Flink 中运算符的示例有 Source 运算符、Transformation 运算符等。我对 Flink 中运算符的理解是否正确?

在算子状态中,Flink 是维护每个算子的状态(例如每个作业/任务的 map()、reduce() 等)还是维护一个完整作业/任务的状态?另外,如果我的作业以多个并行方式提交,每个槽是否都有自己的状态?

假设,我提交了两个带键流的作业,并且两个作业具有相同的键“颜色”,但两个作业完全不同。Flink 是否会维护两种不同的状态,或者为这两项工作维护一种状态。

Dav*_*son 5

无论是算子状态还是键控状态,Flink 状态始终是本地的:每个算子实例都有自己的状态。跨 JVM 或跨作业不存在共享或可见性。

至于这两种状态有何不同:操作符状态总是在堆上,而不是在 RocksDB 中。操作符状态的类型选项有限——ListState 和 BroadcastState——并且不能是 ValueState 或 MapState,这是最常用的键控状态形式。这是由于其分布和重新调整的方式不同所致。

StreamSource 是运算符的一个示例,ProcessOperator 是另一个示例(ProcessOperator 包装了用户提供的 ProcessFunction)。转换不是运算符,它们的作用是将运算符应用于流。例如,OneInputTransformation 将 OneInputStreamOperator 应用于输入。

如果您想更好地了解算子,我推荐 Flink Forward SF 2019 的 Addison Higham 的演讲:成为平滑的算子:看看低级 Flink API 及其功能

如果您想了解 Flink 的内部结构,阅读Hueske 和 Kalavri 编写的 Streamprocessing with Apache Flink确实是最好也是唯一的方法。