无法通过在Apache Beam

时间:2017-10-06 10:20:22

标签: google-cloud-dataflow apache-beam dataflow

我有两个独立的管道说' P1'和' P2'。根据我的要求,我需要在P1完全执行完毕后才运行P2。我需要通过单个模板完成整个操作。

基本上模板会在找到run()的时候创建,就像p1.run()。

所以我可以看到我需要使用两个不同的模板处理两个不同的管道,但这不符合我严格的基于订单的管道执行要求。

我可以考虑在 p2.run()的ParDo中调用 p1.run(),并保持p2的run()等到完成p1的run()。我试过这种方式,但坚持下面给出的IllegalArgumentException。

  

java.io.NotSerializableException:PipelineOptions对象不可序列化,不应嵌入到转换中(您是在字段中还是在匿名类中捕获PipelineOptions对象?)。相反,如果您正在使用DoFn,请在运行时通过ProcessContext / StartBundleContext / FinishBundleContext.getPipelineOptions()访问PipelineOptions,或者在管道构建时从PipelineOptions中提取必要的字段。

根本不可能在任何变换中调用管道的run()说'Pardo'另一条管道?

如果是这种情况,那么如何通过创建单个模板来满足我按顺序调用两个不同管道的要求呢?

1 个答案:

答案 0 :(得分:2)

模板只能包含一个管道。为了对两个独立管道的执行进行排序,每个管道都是模板,您需要在外部安排它们,例如:通过一些工作流程管理系统(例如Anuj所提到的,或Airflow,或其他东西 - 你可以从this post中汲取灵感。)

我们意识到需要在单个管道中更好地对Beam中的基元进行排序,但还没有具体的设计。