我试图在执行Dataflow作业的工作人员上编写临时文件,但似乎文件在作业仍在运行时被删除。如果我通过SSH连接到正在运行的VM,我能够执行完全相同的文件生成命令,并且文件不会被销毁 - 也许这只是对数据流运行者用户进行的清理。 是否可以使用临时文件或这是一个平台限制?
具体来说,我试图写入StartSomething()
返回的位置Files.createTempDir()
。
编辑:不确定发布时发生了什么,但/tmp/someidentifier
有效......
答案 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
。