【问题标题】:Flink when to split stream to jobs, using uid, rebalanceFlink 何时将流拆分为作业,使用 uid,重新平衡
【发布时间】:2019-02-04 08:16:45
【问题描述】:

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

  1. 最好将流拆分到不同的作业以更好地控制并行性,如选项 1 所示,还是选项 2 更好?

    1. 遵循documentation recommendation。我应该为每个操作员输入uid,例如:
dataStream
.uid("firstid")
.keyBy(0)
.flatMap(flatMapFunction)
.uid("mappedId)
  1. 如果有的话,我应该在每个uid 之后添加rebalance 吗?
  2. 如果我按照here 的描述设置MaxParallelism 或从flink UI/cli 设置并行度有什么区别?

【问题讨论】:

    标签: apache-flink flink-streaming


    【解决方案1】:

    您只需要为您的有状态运算符定义.uid("someName")。不需要不保持状态的操作符,因为保存点中没有任何东西需要映射回它们(更多关于这个here)。如果你这样做不会伤害。 rebalance 只会在存在数据倾斜的情况下为您提供帮助,并且仅在您不使用键控流的情况下才能帮助您。如果您基于一个键处理数据,并且您的负载不是均匀分布在您的键上(即您有大量“热”键),那么重新平衡对您没有多大帮助。

    在您上面的示例中,我将启动选项 2,如果工作被证明太重,我可能会转到选项 1。一般来说,无状态进程在 Flink 中非常快,所以除非你想将其他消费者添加到有状态过滤器的输出中,否则不要费心在这个阶段将其拆分。 不过没有对错之分,看你的问题。从简单开始,从那里开始。

    [更新] Re 4, setMaxParallelism 如果我没记错的话,定义了关键组的数量,因此您的流可以重新调整到的最大并行实例数。这是 Flink 内部使用的,但它不会设置你的工作的并行性。通常,您必须将其设置为您为作业设置的实际并行度的倍数(在部署时通过 CLI/UI 中的-p <n>)。

    【讨论】:

    • 谢谢,有道理。但是根据您的回答,最好从选项 1 开始,因为我可能想在无状态运算符上使用更高的并行性,对吗?顺便说一句,请注意我添加了另一个问题
    • 关于 uid 你的意思是我只需要 .uid("mappedId) 因为 flatMapFunction 持有状态?
    • 根据经验,有状态操作符的吞吐量通常要低很多。在有状态运算符之后增加并行度不太可能产生任何影响,因为即使具有相同的并行度,您的无状态运算符也会更快。
    • 回复uid,更多信息here。在.flatMap(flatMapFunction) 之后需要一个(如果flatMapFunction 是有状态的)。其他人很高兴拥有
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 2018-07-18
    • 2017-02-13
    相关资源
    最近更新 更多