我对flink还很陌生,即将加载我们的第一个产品版本。我们有一个数据流。有状态筛选器正在检查数据是否是新的。
如果将流拆分为不同的作业,以获得对并行性的更多控制,会更好吗?如选项1所示,还是选项2更好?
遵循文件建议。我应该把 uid
每个操作员,例如:
dataStream
.uid("firstid")
.keyBy(0)
.flatMap(flatMapFunction)
.uid("mappedId)
我是否应该在每个 uid
如果有的话?
如果按此处所述设置MaxParallelism或从flink ui/cli设置parallelism,有什么区别?
1条答案
按热度按时间wwwo4jvm1#
你只需要定义
.uid("someName")
给你的有状态操作员。不需要太多不保持状态的操作符,因为保存点中没有需要Map回它们的内容(这里有更多介绍)。如果你这么做也不会受伤。rebalance
只有在存在数据倾斜的情况下才有帮助,而且只有在不使用键控流的情况下才有帮助。如果您基于一个键处理数据,并且您的负载没有均匀地分布在您的键上(即您有大量的“热”键),那么重新平衡将不会对您有多大帮助。在你上面的例子中,我会从选项2开始,如果工作太重,可能会转到选项1。一般来说,flink中的无状态进程非常快,因此除非您想将其他使用者添加到有状态过滤器的输出中,否则在这个阶段就不必费心将其拆分。不过,没有对错之分,这取决于你的问题。从简单开始,从那里开始。
[更新]re 4,
setMaxParallelism
如果我没有弄错的话,我定义了密钥组的数量,从而定义了流可以重缩放到的最大并行示例数。flink在内部使用它,但它不会设置作业的并行性。通常必须将其设置为为为作业设置的实际并行度的倍数(通过-p <n>
在cli/ui中(当您部署它时)。