根据我的理解,Flink中的运算符示例包括Source运算符,Transformation运算符等。对于Flink中的运算符,我的理解正确吗?
在操作员状态下,Flink是否维护每个作业/任务的状态(如map(),reduce()等),还是维护一个完整作业/任务的状态?另外,如果我提交的工作具有多个并行性,每个插槽都会有自己的状态吗?
假设,我提交了两个作业,它们是键控流,并且两个作业都具有相同的关键字“ color”,但是两个作业完全不同。 Flink会保持两个不同状态还是要为两个作业都保持一个状态。
答案 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进行流处理确实是最好的也是唯一的方法。