如何使用Dataflow多次执行相同的工作?

时间:2016-12-30 04:26:44

标签: java google-cloud-dataflow gcloud

我有一些工作需要反复完成。例如,让我们说我要掷2000骰子并收集结果。需要注意的是骰子投掷取决于PCollection如何使用Dataflow完成?

我尝试使用PCollectionList,但结果是我的数据流太大而无法启动(> 10 MB)。以下是我想要做的一个示例(使用PCollectionList):

// I'd like to operate on things 2000 times. 
PCollection<Thing> things = ...;
List<PCollection<ModifiedThing>> modifiedThingsList = new ArrayList<>();
for (int i = 0; i < 2000; ++i) {
   modifiedThingsList.add(things.apply(ParDo.of(thing -> modify(thing)));
}
PCollection<ModifiedThing> modifiedThings = PCollectionList.of(modifiedThingsList).apply(Flatten.pCollections());

因为上图的JSON表示对于Dataflow来说太大了,我需要一种表示这种逻辑的不同方式。有任何想法吗?

1 个答案:

答案 0 :(得分:2)

ParDoFlatMapElements每个输入可以返回任意数量的输出。例如:

PCollection<ModifiedThing> modifiedThings = things.apply(
    ParDo.of(new DoFn<Thing, ModifiedThing>() {
  public void processElement(ProcessContext c) {
    for (int i = 0; i < 2000; ++i) {
      c.output(modify(c.element()));
    }
  }
}));

警告:如果您要立即将其他ParDo应用于modifiedThingsbe careful with fusion,那么自2000年以来就是一个非常高的扇出因素。防止融合的一个很好的示例代码片段是here