Google Cloud Dataflow中的临时文件

时间:2015-10-10 09:44:51

标签: google-cloud-dataflow

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

具体来说,我试图写入StartSomething()返回的位置Files.createTempDir()

编辑:不确定发布时发生了什么,但/tmp/someidentifier有效......

2 个答案:

答案 0 :(得分:6)

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

也就是说,写入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。

答案 1 :(得分:2)

Dataflow worker在VM上的Docker容器中运行,该容器安装了主机VM的某些目录,但显然/tmp不是其中之一。

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