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

时间:2019-07-22 17:23:17

标签: apache-flink

根据我的理解,Flink中的运算符示例包括Source运算符,Transformation运算符等。对于Flink中的运算符,我的理解正确吗?

在操作员状态下,Flink是否维护每个作业/任务的状态(如map(),reduce()等),还是维护一个完整作业/任务的状态?另外,如果我提交的工作具有多个并行性,每个插槽都会有自己的状态吗?

假设,我提交了两个作业,它们是键控流,并且两个作业都具有相同的关键字“ color”,但是两个作业完全不同。 Flink会保持两个不同状态还是要为两个作业都保持一个状态。

1 个答案:

答案 0 :(得分:0)

无论是操作员状态还是键控状态,Flink状态始终是本地的:每个操作员实例都有其自己的状态。跨JVM或作业之间没有共享或可见性。

关于两种状态的区别:运算符状态始终处于堆中状态,而在RocksDB中则从不。运算符状态的类型选项有限-ListState和BroadcastState-不能是ValueState或MapState,它们是最常用的键控状态形式。这源于其分发和重新缩放的不同方式。

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

如果您想更好地理解操作员,我建议Flink Forward SF 2019的Addison Higham讲:Becoming a Smooth Operator: A look at low-level Flink APIs and what they enable

如果您想了解Flink的内部知识,那么阅读Hueske和Kalavri的使用Apache Flink进行流处理确实是最好的也是唯一的方法。