Apache Beam 中的侧面输入与普通构造函数参数

Asi*_*bal 5 dataflow broadcast data-processing google-cloud-dataflow apache-beam

我有一个关于 的背景下的侧面输入和广播的一般性问题Apache Beam。期间计算所需的任何其他变量、列表、映射是否processElement需要作为辅助输入传递?如果它们作为普通构造函数参数传递可以吗DoFn?例如,如果我有一些固定(未计算)值变量(常量,如开始日期、结束日期),我想在processElement. PCollectionView现在,我可以分别从每个变量中创建单例,并将它们DoFn作为侧面输入传递给构造函数。但是,我可以不这样做,而只是将每个常量作为普通构造函数参数传递给 吗DoFn?我在这里错过了一些微妙的东西吗?

就代码而言,我什么时候应该这样做:

public static class MyFilter extends DoFn<KV<String, Iterable<MyData>> {
  // these are singleton views
  private final PCollectionView<LocalDateTime> dateStartView;
  private final PCollectionView<LocalDateTime> dateEndView;

  public MyFilter(PCollectionView<LocalDateTime> dateStartView,
                       PCollectionView<LocalDateTime> dateEndView){

      this.dateStartView = dateStartView;
      this.dateEndView = dateEndView;
  }

  @ProcessElement
  public void processElement(ProcessContext c) throws Exception{
  // extract date values from the singleton views here and use them
Run Code Online (Sandbox Code Playgroud)

与以下相反:

public static class MyFilter extends DoFn<KV<String, Iterable<MyData>> {
  private final LocalDateTime dateStart;
  private final LocalDateTime dateEnd;

  public MyFilter(LocalDateTime dateStart,
                       LocalDateTime dateEnd){

    this.dateStart = dateStart;
    this.dateEnd = dateEnd;
  }

  @ProcessElement
  public void processElement(ProcessContext c) throws Exception{
  // use the passed in date values directly here
Run Code Online (Sandbox Code Playgroud)

请注意,在这些示例中,startDateendDate是固定值,而不是任何先前管道计算的动态结果。

Ant*_*ton 6

当您在用于启动管道的程序中调用诸如 gets 之类的实例时pipeline.apply(ParDo.of(new MyFilter(...))。然后它被序列化并传递给运行器执行。然后,运行者决定在哪里执行它,例如在由 100 个虚拟机组成的队列上,每个虚拟机都将接收自己的代码副本和序列化数据。如果成员变量是可序列化的并且您不在执行时改变它们,那么应该没问题(linklink),将在每个节点上反序列化并填充所有字段,并将按预期执行。但是,您无法控制实例的数量或基本上它们的生命周期(在某种程度上),因此更改它们的风险由您自己承担。DoFnmainDoFn

和 侧面输入的好处PCollections是您不限于静态值,因此对于几个简单的不可变值您应该没问题。