从 Dataflow 写入 BigQuery - JSON 文件在作业完成时不会被删除

Writing to BigQuery from Dataflow - JSON files are not deleted when a job finishes

我们的一个数据流作业将其输出写入 BigQuery。我对这是如何在幕后实现的理解是,Dataflow 实际上以 JSON 格式将结果(分片)写入 GCS,然后启动 BigQuery 加载作业以导入该数据。

但是,我们注意到一些 JSON 文件在作业完成后无论成功还是失败都没有被删除。错误消息中没有警告或建议不会删除文件。当我们注意到这一点时,我们查看了我们的存储桶,它有数百个来自失败作业(主要是在开发期间)的大型 JSON 文件。

我原以为 Dataflow 应该处理任何清理,即使作业失败,并且当它成功时,这些文件肯定应该被删除作业完成后留下这些文件会产生大量存储成本!

这是一个错误吗?

"succeeded"但在 GCS 中留下数百个大文件的作业的示例作业 ID:2015-05-27_18_21_21-8377993823053896089

这是一个错误,Dataflow 服务有时无法在 BigQuery 导入作业完成后删除临时 JSON 文件。我们已经在内部解决了这个问题并推出了一个包含修复的版本。

因为这种情况仍在发生,我们决定在管道执行完毕后自行清理。我们 运行 以下命令删除所有非 JAR 或 ZIP 的内容:

gsutil ls -p <project_id> gs://<bucket> | grep -v '[zip|jar]$' | xargs -n 1 gsutil -m rm -r

遗留文件的另一个可能原因是取消作业。当前数据流不会从已取消的作业中删除文件。在其他情况下,应该清理文件。

此外,第一个 post "Unable to delete temporary files" 中列出的错误是我们这边的日志记录问题造成的,应该会在一两周内解决。在那之前,请随意忽略这些错误,因为它们并不表示遗留文件。