我对flink还是很陌生,即将加载我们的第一个生产版本。我们有一个数据流。有状态过滤器正在检查数据是否为新数据。
是否最好将流拆分为不同的作业,以获得对并行性的更多控制,如选项1或选项2所示更好?
uid
吗?dataStream
.uid("firstid")
.keyBy(0)
.flatMap(flatMapFunction)
.uid("mappedId)
答案 0 :(得分:1)
您只需要为有状态运算符定义.uid("someName")
。不保存状态的运算符的需求不大,因为保存点中没有任何内容需要映射回它们(有关此here的更多信息)。即使这样做也不会受伤。
rebalance
仅在存在数据偏斜的情况下(仅当您不使用键控流时)才有帮助。如果您基于某个密钥处理数据,并且负载没有均匀地分布在各个密钥上(即,您有大量“热”密钥),那么重新平衡将无济于事。
在上面的示例中,我将启动选项2并可能在工作证明过于繁重的情况下转到选项1。通常,在Flink中,无状态进程非常快,因此除非您希望将其他使用者添加到有状态过滤器的输出中,否则不要在此阶段进行拆分。 但是,没有对与错,取决于您的问题。从简单开始,然后从那里开始。
[Update] Re 4,setMaxParallelism
(如果我没有记错的话)定义了密钥组的数量,因此可以定义流的最大并行实例数量。这是Flink内部使用的,但没有设置您的工作的并行性。通常,您必须将其设置为您为作业设置的实际并行度的几倍(部署时通过CLI / UI中的-p <n>
)。