Google Cloud Dataflow 中的临时文件

Temp files in Google Cloud Dataflow

我正在尝试在执行 Dataflow 作业的工作人员上写入临时文件,但似乎在作业仍在 运行 时文件已被删除。如果我通过 SSH 连接到 运行 虚拟机,我就能够执行完全相同的文件生成命令并且文件不会被破坏——也许这是只对数据流运行器用户进行的清理。 是否可以使用临时文件或者这是平台限制?

具体来说,我正在尝试写入 Files.createTempDir() 返回的位置,即 /tmp/someidentifier

编辑:不确定我发帖时发生了什么,但 Files.createTempDirectory() 有效...

VM 上 Docker 容器中的数据流工作者 运行,其中安装了主机 VM 的一些目录,但显然 /tmp 不是其中之一。

尝试写入您的临时文件,例如 /dataflow/logs/taskrunner/harness,它将映射到主机 VM 上的 /var/log/dataflow/taskrunner/harness

我们不明确保证您写入本地磁盘的文件的生命周期。

也就是说,写入 ProcessElement 中的临时文件会起作用。您可以在同一个 ProcessElement 中写入和读取它。同样,在 DoFn.startBundle 中创建的任何文件都将在 processElement 和 finishBundle 中可见。

您应该避免写信给 /dataflow/logs/taskrunner/harness。在那里写入文件可能会与 Dataflow 的日志记录发生冲突。我们鼓励您改用标准 Java API File.createTempFile()File.createTempDirectory()

如果您想在 finishBundle 之后保留数据,您应该将数据写入持久存储,例如 GCS。您可以通过将数据作为 sideOutput 发出,然后使用 TextIO 或其他编写器之一来执行此操作。或者,您可以直接从 DoFn 内部写入 GCS。

由于 Dataflow 在容器内运行,您将无法通过 ssh 进入 VM 查看文件。容器挂载了主机 VM 的一些目录,但 /tmp 不是其中之一。您需要附加到适当的容器,例如通过 运行

docker exec -t -i <CONTAINER ID> /bin/bash

该命令将在 运行 容器内启动 shell。