Google cloud dataflow Google云数据流中的临时文件

Google cloud dataflow Google云数据流中的临时文件,google-cloud-dataflow,Google Cloud Dataflow,我试图在执行数据流作业的工作人员上编写临时文件,但似乎这些文件在作业仍在运行时被删除。如果我使用SSH连接到正在运行的VM中,我就能够执行完全相同的文件生成命令,并且文件不会被销毁——也许这只是对dataflow runner用户进行的清理是否可以使用临时文件,或者这是平台限制? 具体地说,我正在尝试写入由Files.createTempDir()返回的位置,即/tmp/someidentifier 编辑:不确定我发布时发生了什么,但是文件。createTempDirectory()工作…数据流

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

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


编辑:不确定我发布时发生了什么,但是
文件。createTempDirectory()
工作…

数据流工作程序在虚拟机上的Docker容器中运行,该容器装载了主机虚拟机的一些目录,但显然
/tmp
不是其中之一


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

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

也就是说,在ProcessElement中写入临时文件将起作用。您可以在同一ProcessElement中对其进行写入和读取。类似地,在DoFn.startBundle中创建的任何文件都将在processElement和finishBundle中可见

您应该避免写入
/dataflow/logs/taskrunner/harnese
。在那里写入文件可能与数据流的日志记录冲突。我们鼓励您使用标准Java API
File.createTempFile()
File.createTempDirectory()

如果要在finishBundle之外保留数据,则应将数据写入持久存储,如GCS。您可以通过将数据作为侧输出发送,然后使用TextIO或其他写入程序之一来实现这一点。或者,您可以直接从DoFn内部向GCS写信

由于数据流在容器中运行,您将无法通过ssh进入VM来查看文件。容器装载了主机VM的一些目录,但
/tmp
不是其中之一。您需要连接到适当的容器,例如通过运行

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

该命令将在运行的容器中启动一个shell。

我使用的是
MapElements。通过(new MySimpleFunction())
,请参见--您的第二段是否适用于该模式?当我使用
Files.createTempDir()
(它在/tmp下给出了一些东西)时,目录和/或其内容立即消失。我确实在使用GCS进行持久存储(输入和输出)。谢谢,是的。在对Processor.apply的调用中创建的/tmp中创建的文件应该在整个调用过程中仍然可见。是什么让您认为该文件正在被删除?你确定是你首先创建的吗?你没有检查mkdirs的结果。有可能mkdirs失败吗?请注意:我的回答不正确。请看Jeremy Lewi的答案(我已将答案的正确部分合并到他的答案中)。