在 apache beam 中传递大型管道选项的最佳实践

Best practice to pass large pipeline option in apache beam

我们有一个用例,我们希望将数百行 json 规范传递给我们的 Apache Beam 管道。?一种直接的方法是创建自定义管道选项,如下所述。有没有其他方法可以将输入作为文件传递?

public interface CustomPipelineOptions extends PipelineOptions {
    @Description("The Json spec")
    String getJsonSpec();
    void setJsonSpec(String jsonSpec);
}

我想在 Google 数据流引擎中部署管道。即使我将规范作为文件路径传递并在启动管道之前读取光束代码中的文件内容,我如何捆绑管道的规范文件部分。 P.S 注意,我不想在我的 beam 代码可用的地方提交源代码的 spec 文件(在资源文件夹中)部分。它需要可配置,即我想为不同的光束流水线作业传递不同的规范文件。

您可以将选项作为 POJO 传递。

public class JsonSpec {
    public String stringArg;
    public int intArg;
}

然后在您的选项中参考

public interface CustomPipelineOptions extends PipelineOptions {
    @Description("The Json spec")
    JsonSpec getJsonSpec();
    void setJsonSpec(JsonSpec jsonSpec);
}

选项将被解析为class; I believe by Jackson though not sure.

我想知道为什么要将“数百行 JSON”作为管道选项传递?这看起来不像是一种非常“Beam”的做事方式。管道选项应该通过配置;每个管道真的需要数百行配置 运行 吗?如果您打算传递数据以创建 PCollection,那么最好使用 TextIO,然后将行处理为 JSON.

Beam PipelineOptions,顾名思义,旨在用于提供小的配置参数来配置管道。 PipelineOptions 通常在作业提交时阅读。因此,即使您使用 PipelineOption 获得作业提交程序的 json 规范,您也必须确保编写程序,以便您的 DoFn 可以在运行时访问该文件.为此:

  1. 您必须将文件保存在 Dataflow VM 可以访问的分布式存储系统中(例如,GCS)
  2. 您必须将输入文件传递给读取文件的转换。

有多种方法可以做到 (2)。例如,

  • 直接将文件路径传递给你的DoFn的构造函数。
  • 将文件路径作为 side input 传递给您的转换(允许您在运行时配置它)