如何并行化apache-beam(数据流)管道DAG

时间:2018-10-02 12:39:33

标签: google-cloud-dataflow apache-beam

我正在使用apache-beam 2.5.0 python SDK

在管道中附加代码段,我从pubsub主题中解析i / p,并希望对其执行一些操作,当我使用DataflowRunner运行它时,它运行良好,但似乎“数据处理很有趣” ,“数据处理功能2”,“数据处理功能3”按顺序运行,我需要它并行运行。 我是数据流的新手。

是否可以并行化它?

def run():
   parser = argparse.ArgumentParser()
   args, pipeline_args = parser.parse_known_args()
   options = PipelineOptions(pipeline_args)

   with beam.Pipeline(options=options) as p:
       data = (p | "Read Pubsub Messages" >> 
            beam.io.ReadFromPubSub(topic=config.pub_sub_topic)
              | "Parse messages " >> beam.Map(parse_pub_sub_message_with_bq_data)
            )

       data | "data processing fun1 " >> beam.ParDo(Fun1())
       data | "data processing fun2" >> beam.ParDo(Fun2())
       data | "data processing fun3" >> beam.ParDo(Fun3())
if __name__ == '__main__':
   run()

1 个答案:

答案 0 :(得分:0)

为什么需要这些功能同时运行?

Beam / Dataflow绘制图表,并尝试优化可以在同一线程中运行的事物。这称为 fusion 优化,并且在Flume Java paper中有所提及。

要点是,通常在同一线程上逐个运行这些功能会比在多个处理线程或VM之间交换数据以并行处理更为有效。

如果您的功能必须或多或少并行运行,则可以在下游转换之前添加beam.Reshuffle转换:

data = (p 
        | beam.io.ReadFromPubSub(topic)
        | beam.Map(parse_messages))

# After the data has been shuffled, it may be consumed by multiple workers
data | beam.Reshuffle() | beam.ParDo(Fun1())
data | beam.Reshuffle() | beam.ParDo(Fun2())
data | beam.Reshuffle() | beam.ParDo(Fun3())

让我知道是否可以在其中添加一些细节。

相关问题