【问题标题】:Flink: Broadcasted Operator chainingFlink:广播运算符链接
【发布时间】:2020-03-10 15:33:48
【问题描述】:

假设我有一个 events 的数据流,我想将它广播到一个(丰富的)地图运算符(map1),该运算符链接到另一个(丰富的)地图运算符(map2)。两张图的平行度是一样的。我想要的是 map1 的每个并行实例的输出转到 map2 的一个并行实例(即,两个地图之间没有广播)。这是我到目前为止所做的,但我不确定它是否在逻辑上正确。还好吗?

val trainedStream = events.broadcast.map(new Mapper1(...)).setParallelism(par)
trainedStream.startNewChain.map(new Mapper2(...)).setParallelism(par)

后续问题:map1 和 map2 的两个链式子任务/并行实例的 SubtaskIndex(从 RuntimeContext.getIndexOfThisSubtask 接收)是否相同?有没有办法检查这个?

代码在 Scala 中,但我猜这同样适用于 Java

【问题讨论】:

    标签: java scala apache-flink flink-streaming


    【解决方案1】:

    只要可能,Flink 中的链接就会自动发生。因此,在您的示例中,仅使用就足够了

    val trainedStream = events.broadcast.map(new Mapper1(...)).map(new Mapper2(...))
    

    我会在env 上设置并行度。

    顺便说一句,您确定要广播这些活动吗? Datastream 默认是并行处理的。广播事件非常不寻常,因为它们会根据并行度被多次处理。

    后续问题:map1 和 map2 的两个链式子任务/并行实例的 SubtaskIndex(从 RuntimeContext.getIndexOfThisSubtask 接收)是否相同?有没有办法检查这个?

    子任务索引对于链式操作符来说是相同的,因为它们驻留在同一个任务中(因此它们甚至不能有不同的索引)。如果你有一个任务mapper1 -> mapper2,你可以看到链接成功。

    【讨论】:

    • 谢谢!是的,我想广播它,因为 map1/map2 的每个并行实例根据其 subTaskIndex 以不同方式处理流
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多