2015-10-10 1 views
1

Я пытаюсь записать временные файлы для рабочих, выполняющих задания Dataflow, но кажется, что файлы удаляются во время выполнения задания. Если я вхожу в SSH в запущенную виртуальную машину, я могу выполнить ту же самую команду генерации файлов, и файлы не будут уничтожены - возможно, это очистка, которая выполняется только для пользователя-бегуна потока данных. Возможно ли использовать временные файлы или это ограничение платформы?Временные файлы в облачном потоке Google

В частности, я пытаюсь написать на адрес, указанный Files.createTempDir(), что составляет /tmp/someidentifier.

Edit: Не уверен, что происходит, когда я отправил, но Files.createTempDirectory() работы ...

ответ

3

Мы не предоставляем явной гарантии о времени жизни файлов, которые вы пишете на локальный диск.

Таким образом, запись во временный файл внутри ProcessElement будет работать. Вы можете писать и читать из него в пределах одного ProcessElement. Аналогично, любые файлы, созданные в DoFn.startBundle, будут видны в processElement и заканчиваютсяBundle.

Вам следует избегать писать до /dataflow/logs/taskrunner/harness. Запись файлов может привести к конфликту с протоколированием Dataflow. Мы рекомендуем использовать стандартные Java API File.createTempFile() и File.createTempDirectory().

Если вы хотите сохранить данные за пределами finishBundle, вы должны записать данные в надежное хранилище, такое как GCS. Вы можете сделать это, испустив данные как sideOutput, а затем используя TextIO или один из других авторов. Кроме того, вы можете просто написать GCS непосредственно из своего DoFn.

Поскольку Dataflow запускается внутри контейнеров, вы не сможете увидеть файлы с помощью ssh'ing в VM. В контейнере есть некоторые из каталогов хост-VM, но /tmp не является одним из них. Вам нужно будет прикрепить к соответствующему контейнеру, например. бег

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

Эта команда запустит оболочку внутри работающего контейнера.

+0

Я использую 'MapElements.via (новый MySimpleFunction())', см. [Здесь] (https://gist.github.com/zbjornson/ac6a378129f1675ca5ff?ts=4) - если ваш второй абзац применим для этого режима ? Когда я использую 'Files.createTempDir()' (который дает что-то под/tmp), каталог и/или его содержимое мгновенно исчезают. Я действительно использую GCS для постоянного хранения (ввода и вывода). Спасибо - – ZachB

+0

Да. Файл, созданный в/tmp, созданный внутри вызова Processor.apply, должен оставаться видимым во время этого вызова. Что заставляет вас думать, что файл удаляется? Вы уверены, что создали его в первую очередь? Вы не проверяете результат mkdirs. Возможно ли, что mkdirs не удалось? –

2

DataFlow работники работают в контейнере Докер на VM, которая имеет некоторые из каталогов хозяина VM смонтированной, но, видимо, /tmp не является одним из них.

Попробуйте записать временные файлы, например, в /dataflow/logs/taskrunner/harness, который будет отображаться на /var/log/dataflow/taskrunner/harness на виртуальной машине хоста.

+0

Обратите внимание: этот мой ответ неправильный. См. Ответ Джереми Льюи (я объединил правильные части моего ответа в его). – jkff

Смежные вопросы