更改何时使用uid将流拆分为作业,重新平衡

时间:2019-02-04 08:16:46

标签: apache-flink flink-streaming

我对flink还是很陌生,即将加载我们的第一个生产版本。我们有一个数据流。有状态过滤器正在检查数据是否为新数据。

  1. 是否最好将流拆分为不同的作业,以获得对并行性的更多控制,如选项1或选项2所示更好? split steam vs single

    1. 遵循documentation recommendation。我应该为每个运算符输入uid吗?
dataStream
.uid("firstid")
.keyBy(0)
.flatMap(flatMapFunction)
.uid("mappedId)
  1. 是否应该在每个uid之后添加rebalance
  2. 如果我按照here设置MaxParallelism或从flink UI / cli设置并行性,有什么区别?

1 个答案:

答案 0 :(得分:1)

您只需要为有状态运算符定义.uid("someName")。不保存状态的运算符的需求不大,因为保存点中没有任何内容需要映射回它们(有关此here的更多信息)。即使这样做也不会受伤。 rebalance仅在存在数据偏斜的情况下(仅当您不使用键控流时)才有帮助。如果您基于某个密钥处理数据,并且负载没有均匀地分布在各个密钥上(即,您有大量“热”密钥),那么重新平衡将无济于事。

在上面的示例中,我将启动选项2并可能在工作证明过于繁重的情况下转到选项1。通常,在Flink中,无状态进程非常快,因此除非您希望将其他使用者添加到有状态过滤器的输出中,否则不要在此阶段进行拆分。 但是,没有对与错,取决于您的问题。从简单开始,然后从那里开始。

[Update] Re 4,setMaxParallelism(如果我没有记错的话)定义了密钥组的数量,因此可以定义流的最大并行实例数量。这是Flink内部使用的,但没有设置您的工作的并行性。通常,您必须将其设置为您为作业设置的实际并行度的几倍(部署时通过CLI / UI中的-p <n>)。