Google cloud dataflow 无法通过在Apache Beam中创建模板按所需顺序运行多个管道

Google cloud dataflow 无法通过在Apache Beam中创建模板按所需顺序运行多个管道,google-cloud-dataflow,apache-beam,dataflow,Google Cloud Dataflow,Apache Beam,Dataflow,我有两个独立的管道,分别是'P1'和'P2'。根据我的要求,我只需要在P1完全完成其执行后运行P2。我需要通过一个模板完成整个操作 基本上,模板是在找到run()时创建的,比如p1.run() 所以我可以看到,我需要使用两个不同的模板处理两个不同的管道,但这不能满足我严格的基于订单的管道执行要求 另一种方法是在p2.run()的ParDo中调用p1.run(),并让p2的run()等待p1的run()完成。我试过这种方法,但仍坚持下面给出的IllegalArgumentException jav

我有两个独立的管道,分别是'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”


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

一个模板只能包含一个管道。为了对两个单独的管道(每个管道都是一个模板)的执行进行排序,您需要在外部对它们进行调度,例如通过一些工作流管理系统(例如Anuj提到的,或者气流,或者其他东西,您可能会从中得到一些启示)


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

我认为数据流不是按照您的要求进行排序的正确方法。您应该看看像luigi或Airflow这样的工作流管理器,或者创建两个不同的管道,从不同的模块调用它们,以便它们一个接一个地执行。但是你需要再次确保第一份工作不会fail@anuj也尝试了第二种方法!!!创建了两个不同的模块,并通过创建调用者类的模板从不同的类中按我想要的顺序调用它们。作业再次失败,说明了一些非法的例外情况,可以得出结论,这样我们也无法实现所需的功能。是的,我已经提到了。问题是,数据流并不是按照工作流管理器程序的方式构建的!您可以研究Luigi,它实际上是一个基于python的工作流管理系统。谢谢。这很有说服力。我期待着探索一些同样的工作流管理系统。到2020年,我们有更好的排序原语了吗?