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。
我正在尝试在执行 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。