Как распаковать и выполнить задание пакетной службы в рамках фабрики данных Azure

Фабрика данных Azure может выполнять настраиваемые действия как задания пакетной службы. Эти задания могут запускаться из .exe (и связанных зависимостей) в учетной записи хранения, которые копируются перед выполнением.

Существует ограничение на файлы в учетной записи хранения, которые можно использовать:

Общий размер resourceFiles не может превышать 32768 символов.

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

Unzip.exe [myZipFilename] && MyExeName.exe [cmdLineArgs]

Запуск этого локально на компьютере с Windows 10 работает нормально. Установка этого параметра в качестве параметра команды для настраиваемого действия пакетной службы (с использованием пула приложений образов ОС Windows Server 2019 облачных служб) приводит к:

Внимание: имя файла не совпадает: &&

Это похоже на что-то базовое, чего мне не хватает, но я пробовал различные перестановки и не могу заставить его работать.


person Cargowire    schedule 05.05.2019    source источник
comment
Вместо архивирования и разархивирования файлов вы также можете рассмотреть возможность создания файлов ресурсов со свойством storageContainerUrl, а не указывать каждую индивидуальность. Предполагая, что некоторые файлы находятся в одном контейнере, это должно резко сократить количество символов в вашем запросе.   -  person brklein    schedule 06.05.2019
comment
@brklein Я не уверен, что понимаю, о чем вы? В пользовательском действии фабрики данных я подключаюсь к пакетной службе и пулу приложений, а затем в настройках устанавливаю «Ресурсную службу» для учетной записи хранения и контейнера с путем к папке, из которой будет скопировано приложение. Это так детально, как кажется? все, что он делает за кулисами, когда выполняется действие по извлечению этих файлов и помещению их в пакетный узел, для меня по сути является черным ящиком.   -  person Cargowire    schedule 07.05.2019
comment
Это моя беда. Я не знал, что вы используете ADF, который предоставляет только подмножество пакетных функций.   -  person brklein    schedule 08.05.2019


Ответы (3)


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

Несколько идей, которые могут вызвать такое поведение:

  • Пожалуйста, попробуйте свою командную строку в кавычках с точки зрения пакетной обработки, например: cmd /c "Unzip.exe [myZipFilename] && MyExeName.exe [cmdLineArgs]"

  • Убедитесь, что ваш файл существует, т.е. одна из возможностей: в конце команда пытается запустить пустую строку с &&, т.е. cmd /c "unzip.exe "empty" && ...

Надеюсь, что одно из двух исправлений выше, или не стесняйтесь добавлять больше деталей и т. Д. al.

person Tats_innit    schedule 05.05.2019
comment
Я не уверен в контексте, в котором команды выполняются в агенте узла пакетной обработки Azure, но Unzip.exe напрямую при выполнении команды (и вы можете видеть вывод справки по умолчанию), но запуск его как части cmd /c "Unzip.exe" завершается ошибкой из-за того, что unzip.exe неизвестный. - person Cargowire; 07.05.2019
comment
Точно, мне было интересно, так почему вы думаете, что unzip.exe будет работать, если это что-то запекается ADF? Мы можем обсудить и посмотреть, что на самом деле будет полезно, но я не уверен в том, как работает ADF Идея: когда вы запускаете узел, удалите журнал внутри узла, а затем вы можете запустить эту команду в cmd спросите там, если это сработает, то это должно быть, в противном случае вам нужно сначала убедиться, что ресурс, который вы используете, является чем-то, что запекается внутри узла перед использованием. т.е. я не уверен, запекается unzip.exe внутри наших узлов или нет. - person Tats_innit; 07.05.2019
comment
В итоге я отказался от идеи, что unzip каким-то образом встроен в контекст выполнения и включил его как часть моих ресурсов. - person Cargowire; 08.05.2019

Не зная полностью контекста, в котором ADF запускает пользовательские команды действий на узле пакетной службы Windows, я изменил свою настройку, чтобы не ожидать существования Unzip.exe (чего, похоже, не происходит при работе под cmd /c "Unzip.exe", а не только с Unzip.exe в качестве команды) .

Теперь содержимое моей учетной записи хранения, поддерживающее настраиваемое действие, имеет:

  • исполняемый файл.zip (мое приложение .NET Core Console, опубликованное для Windows со всеми зависимостями)
  • unzip.exe (taken from Git Bash on my local machine)
    • including the msys-2.0.dll and msys-bz2-1.dll dependencies

Тогда команда в ADF следующая:

cmd /c "Unzip.exe executable-with-deps.zip && executable.exe"
person Cargowire    schedule 08.05.2019

У меня была та же проблема, и я решил ее с помощью короткого сценария PowerShell, который извлекает мой zip и запускает мою программу. Общий сценарий выглядит так (называется unzipandrun.ps1):

[CmdletBinding()]
param (    
    [Parameter(Mandatory = $true)][String]$zipFile,    
    [Parameter(Mandatory = $true)][String]$executable,    
    [Parameter(Mandatory = $true)][String]$prm
)
#######
# Unzip
#######
Add-Type -AssemblyName System.IO.Compression.FileSystem
function Unzip
{
    param([string]$zipfile, [string]$outpath)
    [System.IO.Compression.ZipFile]::ExtractToDirectory($zipfile, $outpath)
}
"Start Unzip $zipFile" | Write-Host
Unzip $zipFile $pwd
###########
# Start exe
###########
"Start $executable $prm" | Write-Host
$cmd = "& $executable $prm"
Invoke-Expression $cmd

Поэтому, если я хочу запустить myapp.exe с параметром / t 123 в пакете Azure, я бы начал:

PowerShell -NoProfile -ExecutionPolicy Bypass -Command "unzipandrun.ps1 '/t 123'"
person Daniel W.    schedule 12.01.2021