DataFlow输出多个文件

时间:2018-10-19 18:36:16

标签: google-cloud-platform google-cloud-dataflow apache-beam

当我处理一个大文件(超过500万行)时,看到的东西有些奇怪。在代码中,我的分片数量设置为1。但是,当我看到15个以上的文件被踢出时,我不确定为什么。谷歌搜索并没有给我任何东西来解释为什么发生这种情况。

作为摘要,下面是输出部分:

    results.get(valid).setCoder(StringUtf8Coder.of()).apply("Build Window For Valid Entries", Window.<String>into(new GlobalWindows()).triggering(Repeatedly.forever(AfterProcessingTime.pastFirstElementInPane().plusDelayOf(Duration.ZERO))).withAllowedLateness(Duration.ZERO).discardingFiredPanes())
    .apply("Write valid to GCS", TextIO.write().to(validFileLocation).withSuffix(".csv").withWindowedWrites().withNumShards(1));

有人有什么想法吗?

2 个答案:

答案 0 :(得分:0)

如果您的输入是无限制的,那么您如何期望只写一个文件?

TextIO必须要么等待无界输入的末尾,要么使用开窗(边界数据)将其分片。

我不知道在GlobalWindow上触发的预期行为,也许只有最后一个文件包含所有数据?还是您达到了GCS的大小限制?

此外,GCS不允许修改文件,您只能添加或删除文件。

答案 1 :(得分:0)

我最终弄清楚了这一点。 GlobalWindows很好,但是要做我想做的最好方法是使用Session窗口。这样就解决了这个问题。

例如Sessions.withGapDuration(Duration.standardSeconds(10)))

这是说:“在收到最后一个数据包10秒钟后,如果我什么都没收到,请继续输出”