根据我的理解,flink中的运算符示例有源运算符、变换运算符等。我对flink中运算符的理解是否正确?
在operator state中,flink是保持每个operator的状态,如(map()、reduce()等,针对每个作业/任务)还是保持一个完整作业/任务的状态?另外,如果我的作业以多个并行提交,那么每个插槽是否都有自己的状态?
假设,我已经提交了两个工作,这是键流和两个工作都有相同的键说“颜色”,但这两个工作是完全不同的。Flink会维持两种不同的状态,还是两种工作都会维持一种状态。
根据我的理解,flink中的运算符示例有源运算符、变换运算符等。我对flink中运算符的理解是否正确?
在operator state中,flink是保持每个operator的状态,如(map()、reduce()等,针对每个作业/任务)还是保持一个完整作业/任务的状态?另外,如果我的作业以多个并行提交,那么每个插槽是否都有自己的状态?
假设,我已经提交了两个工作,这是键流和两个工作都有相同的键说“颜色”,但这两个工作是完全不同的。Flink会维持两种不同的状态,还是两种工作都会维持一种状态。
1条答案
按热度按时间rjee0c151#
不管是操作符状态还是键控状态,flink状态总是本地的:每个操作符示例都有自己的状态。在jvm或作业之间没有共享或可见性。
至于这两种状态的区别:操作符状态总是在堆上,而不是在rocksdb中。运算符状态具有有限的类型选项liststate和broadcaststate,并且不能是valuestate或mapstate,这是最常用的键控状态形式。这源于它的分布和重新缩放的不同方式。
streamsource是操作符的一个示例,processoperator是另一个示例(processoperator环绕用户提供的processfunction)。转换不是运算符,它们的作用是将运算符应用于流。例如,oneinputtransformation将oneinputstreamoperator应用于输入。
如果您想更好地理解操作符,我推荐addison higham在flink forward sf 2019:成为一个平滑的操作符:一个低级别的flink api和它们所支持的内容。
如果您想了解flink的内部结构,那么阅读hueske和kalavri的apacheflink流处理确实是最好的也是唯一的方法。