我正在使用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()
答案 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())
让我知道是否可以在其中添加一些细节。