管道运行后移动文件

时间:2015-10-10 14:00:58

标签: google-cloud-dataflow

数据流管道运行完毕后,是否可以在GCS中移动文件?如果是这样,怎么样?应该是最后一个.apply?我无法想象是这样的。

这里的情况是我们从客户端导入了很多.csv。我们需要无限期保留这些CSV,因此我们要么“将CSV标记为已经处理”,要么将它们移出TextIO用于查找csv的初始文件夹。我目前唯一能想到的就是在BigQuery中存储文件名(我不知道我是如何得到这个,我是DF新手),然后排除已经从执行中存储的文件管道莫名其妙?但必须有一个更好的方法。

这可能吗?我该怎么办?

感谢您的帮助!

1 个答案:

答案 0 :(得分:4)

您可以尝试使用BlockingDataflowPipelineRunner并在p.run()之后在主程序中运行任意逻辑(它将等待管道完成)。

请参阅Specifying Execution Parameters,特别是"阻止执行"。

但是,一般情况下,您似乎确实需要一个持续运行的管道,该管道使用CSV文件监视目录并在出现时导入新文件,从不导入相同的文件两次。对于流式传输管道来说,这将是一个很好的例子:您可以编写一个自定义UnboundedSource(另请参阅Custom Sources and Sinks)来查看目录并在其中返回文件名(即T可能是StringGcsPath):

p.apply(Read.from(new DirectoryWatcherSource(directory)))
 .apply(ParDo.of(new ReadCSVFileByName()))
 .apply(the rest of your pipeline)

其中DirectoryWatcherSource是您的UnboundedSourceReadCSVFileByName也是您需要编写的转换文件路径,并将其作为CSV文件读取,返回其中的记录(遗憾的是,您现在无法在管道中间使用TextIO.Read等转换,只能在开头使用 - 我们正在努力修复此问题。)

这可能有点棘手,正如我所说,我们在工作中有一些功能使其更简单,我们正在考虑创建这样的内置源,但它可能是现在,这仍然比弹球作业更容易"。如果有任何不清楚的地方,请试试dataflow-feedback@google.com告诉我们!

与此同时,您还可以存储有关您在Cloud Bigtable处理或尚未处理的文件的信息 - 它比BigQuery更适合这些文件,因为它更多适用于随机写入和查找,而BigQuery更适合在整个数据集上进行大量批量写入和查询。