Apache Beam DirectRunner 支持不同 ParDo/DoFn 的多线程处理

时间:2021-01-03 23:59:33

标签: java kotlin apache-beam

我将 Apache Beam 与 DirectRunner 结合使用。我有 5 个用 ParDos 包裹的 DoFns,它们一个接一个地应用。当 Pipeline 运行()时,首先 DoFn 处理它的所有工作,然后是第二个,然后是第三个。我希望第二个 DoFn 在第一个发出输出后立即开始工作,以便并行处理,因为目前在任何给定时间最多有一个 DoFn 正在工作(相关:Thread Synchronization for DoFn in Apache Beam)。

    val pipelineOptions = PipelineOptionsFactory
        .fromArgs("--streaming", "--experiments=use_runner_v2")
        .withValidation()
        .create()
        .`as`(DirectOptions::class.java)

    pipelineOptions.isBlockOnRun = true
    pipelineOptions.isEnforceEncodability = true
    pipelineOptions.isEnforceImmutability = true
    pipelineOptions.targetParallelism = Runtime.getRuntime().availableProcessors() * 2
    pipelineOptions.appName = name

    val pipeline = Pipeline.create(pipelineOptions)

    pipeline
        .apply(...)
        .apply(...)
        .apply(...)
        .apply(...)
        .apply(...)
        .apply(...)

    pipeline
        .run()
        .waitUntilFinish()

1 个答案:

答案 0 :(得分:0)

Java DirectRunner 已经独立和异步地执行每个阶段。它有固定数量的工作线程。您所遇到的情况是由于您的输入都在一个包中,因此它们都一起提交。 DirectRunner 不会重新捆绑输入,因此捆绑将一起通过管道。

如果您有一个真正的流式无界数据源,DirectRunner 将在每个包从源发出时对其进行处理。

相关问题