什么是 Flink 中的运算符?运算符状态和键控状态有何不同?



根据我的理解,Flink 中的运算符示例包括源运算符、转换运算符等。我对 Flink 中的运算符的理解是否正确?

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

假设,我提交了两个键流作业,并且两个作业都有相同的键说"颜色",但两个作业完全不同。Flink 是要维护两种不同的状态,还是要为两个作业维护一种状态。

无论是算子状态还是键控状态,Flink 状态始终是局部的:每个算子实例都有自己的状态。JVM 或作业之间没有共享或可见性。

至于这两种状态有何不同:运算符状态始终在堆上,而不是在 RocksDB 中。运算符状态具有有限的类型选项 - ListState 和 BroadcastState - 并且它不能是 ValueState 或 MapState,它们是最常用的键控状态形式。这源于它分布和重新缩放的不同方式。

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

如果你想更好地了解运算符,我推荐 Flink Forward SF 2019 的 Addison Higham 的演讲:成为一个平滑的操作员:看看低级 Flink API 及其支持的内容。

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

相关内容

  • 没有找到相关文章

最新更新