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)
请注意,在这些示例中,startDate和endDate是固定值,而不是任何先前管道计算的动态结果。
当您在用于启动管道的程序中调用诸如 gets 之类的实例时pipeline.apply(ParDo.of(new MyFilter(...))。然后它被序列化并传递给运行器执行。然后,运行者决定在哪里执行它,例如在由 100 个虚拟机组成的队列上,每个虚拟机都将接收自己的代码副本和序列化数据。如果成员变量是可序列化的并且您不在执行时改变它们,那么应该没问题(link,link),将在每个节点上反序列化并填充所有字段,并将按预期执行。但是,您无法控制实例的数量或基本上它们的生命周期(在某种程度上),因此更改它们的风险由您自己承担。DoFnmainDoFn
和 侧面输入的好处PCollections是您不限于静态值,因此对于几个简单的不可变值您应该没问题。
| 归档时间: |
|
| 查看次数: |
2538 次 |
| 最近记录: |