Зависимости пакетных задач Azure: копирование файлов из предыдущих - PullRequest
0 голосов
/ 18 октября 2019

У меня есть сценарий пакетной службы Azure, в котором у меня есть цепочка задач, которые выполняются друг за другом. Зависимости установлены правильно, поэтому они хорошо работают друг за другом.

Однако мне нужно скопировать все файлы из папки предыдущей задачи в папку новой задачи перед выполнением. Я не знаю заранее, сколько и каких файлов будет, поэтому я просто хочу все скопировать. Я не смог найти способ сделать это с помощью клиентской библиотеки Batch (https://docs.microsoft.com/en-us/dotnet/api/overview/azure/batch?view=azure-dotnet).

. В качестве обходного пути я попытался добавить простую задачу копирования в файл .bat, который выполняется с commandline, но по какой-то причинеон копирует только некоторые файлы.В одной задаче есть несколько сотен файлов для копирования, и это меняет на несколько%, насколько большая часть копируется, прежде чем перестает копировать (без ошибок). Это моя команда копирования: $"cmd /c xcopy /E /F /Y %AZ_BATCH_TASK_WORKING_DIR%\\..\\..\\{previousTaskId}\\wd %AZ_BATCH_TASK_WORKING_DIR%". Все работает правильно, если выполняется непосредственно с виртуальной машины.

Проверенная гипотеза:

  • Копирование перезаписывает файл .bat, который выполняет фактическую обработку. Это, в свою очередь, прерывает копирование. теперь исключил эту проблему (каждая задача имеет файл с другим именем .bat)
  • По какой-то причине копирование выполняется параллельно. Я добавил временные метки для летучих мышей, и параллелизма нет, поэтому это не может бытьпричина. Также попытался добавить sleep 10 до xcopy, но безрезультатно.
  • xcopy по какой-то причине не видит все файлы. ДобавитьРедактировал команду dir, чтобы увидеть, какие файлы существуют, и он видит только те же файлы, которые копирует xcopy.
  • Проблемы с доступом пользователей. Не имеет смысла, так как некоторые файлы успешно копируются и ошибок нет.

Есть идеи? Это звучит как банальный сценарий, но я просто не мог понять, как это сделать.

Ответы [ 2 ]

1 голос
/ 20 октября 2019

Что вы настроили в качестве retentionTime для своих задач?

Мне интересно, выполняет ли пакетная очистка предыдущей задачи (удаляя все файлы) одновременно с тем, как ваша последующая задача пытается их скопировать.

Непроверенное предложение ...

... при условии, что у вас есть задачи A и B, которые выполняются в указанном порядке (принудительно с использованием зависимостей задач).

... configure outputFile в задаче Aскопировать все файлы, созданные A, в вашу учетную запись хранения. Используйте подстановочные знаки, чтобы все файлы были скопированы в один и тот же контейнер.

... configure resourceFile в задаче B, чтобы скопировать все файлы из вашей учетной записи хранения в рабочий каталог задачи.

Это имеет преимущество в том, что сохраняет ваши промежуточные рабочие файлы вне вычислительного узла, что позволяет вам выбирать, где вы остановились, если / когда что-то прерывает вашу рабочую нагрузку.

0 голосов
/ 21 октября 2019

Оказалось, что проблема была в предыдущем задании: он запустил процесс, который начал генерировать файлы в фоновом режиме и немедленно вернул управление. Поэтому пакетный движок решил, что задача выполнена, и перешел к следующей задаче, которая сначала копировала файлы, сгенерированные предыдущей задачей.

Поэтому моя гипотеза о параллелизме была частично верной, хотя она не была видна при отображении меток времени(первая задача сказала, что она закончена, прежде чем вторая задача сказала, что она началась). Эксперимент с sleep выявил бы проблему, но я либо использовал слишком короткую задержку сна, либо как-то неверно прочитал результаты.

Поскольку я не могу контролировать, как первая задача запускает процесс, я теперь добавил несколькоПакетный скрипт Windows для опроса tasklist о том, когда завершится процесс и решит проблему.

...