Можно ли обновить только часть задания склеивания с помощью AWS CLI?

#aws-cli #aws-glue

#aws-cli #aws-glue

Вопрос:

Я пытаюсь включить в свою разработку CI / CD обновление script_location и только этого параметра. AWS просит меня включить необходимые параметры , такие как RoleArn . Как я могу обновить только ту часть конфигурации задания, которую я хочу изменить?

Это то, что я пытаюсь использовать

 aws glue update-job --job-name <job_name> --job-update Command="{ScriptLocation=s3://<s3_path_to_script>}
 

Вот что происходит :

An error occurred (InvalidInputException) when calling the UpdateJob operation: Command name should not be null or empty.

Если я добавлю имя команды по умолчанию glueetl , вот что произойдет :

An error occurred (InvalidInputException) when calling the UpdateJob operation: Role should not be null or empty.

Ответ №1:

Я не знаю, решили ли вы эту проблему, но я справился с помощью этой команды:

 aws glue update-job --job-name <gluejobname> --job-update Role=myRoleNameBB,Command="{Name=<someupdatename>,ScriptLocation=<local_filename.py>}"
 

Вам не нужен ARN роли, скорее имя роли. В приведенном выше примере предполагается, что у вас есть роль с именем myRoleNameBB, и у нее есть доступ к AWS Glue.

Примечание: Я использовал локальный файл на своем ноутбуке. Кроме того, «Имя» в «Командной» части также является обязательным.

Когда я запускаю его, я получаю этот вывод:

 {
    "JobName": "<gluejobname>"
}
 

Ответ №2:

Простой способ обновить с помощью CLI задание склеивания или триггер склеивания — использовать опцию —cli-input-json . Чтобы использовать правильный json, вы могли бы использовать aws glue update-job --generate-cli-skeleton то, что возвращает полную структуру, для вставки ваших изменений.

ПРИМЕР:

{"JobName":"","JobUpdate":{"Description":"","LogUri":"","Role":"","ExecutionProperty":{"MaxConcurrentRuns":0},"Command":{"Name":"","ScriptLocation":"","PythonVersion":""},"DefaultArguments":{"KeyName":""},"NonOverridableArguments":{"KeyName":""},"Connections":{"Connections":[""]},"MaxRetries":0,"AllocatedCapacity":0,"Timeout":0,"MaxCapacity":null,"WorkerType":"G.1X","NumberOfWorkers":0,"SecurityConfiguration":"","NotificationProperty":{"NotifyDelayAfter":0},"GlueVersion":""}}

Ну, здесь просто введите имя задания и измените параметры. После этого вам нужно преобразовать свой json в однострочный json и отправить в команду с помощью ' '

 aws glue update-job --cli-input-json '<one-line-json>'
 

Я надеюсь, что помогу кому-нибудь и с этой проблемой.

Ссылка:

Ответ №3:

Основываясь на том, что я нашел, невозможно обновить только часть задания с помощью API update-job.

Я столкнулся с той же проблемой и предоставил роль, чтобы обойти эту ошибку. Команда сработала, но API обновления заданий фактически сбрасывает другие параметры по умолчанию, такие как тип приложения, язык задания, класс, время ожидания, максимальная емкость и т.д.

Поэтому, если ваше ранее существовавшее задание является приложением Spark в scala, оно завершится неудачей, поскольку AWS по умолчанию использует оболочку Python и python в качестве языка задания как часть API обновления заданий. И этот API не предоставляет возможности установить тип языка задания на scala и установить основной класс (требуется в случае scala). Это позволяет установить тип приложения на Spark application.

Если вы не хотите указывать роль в API обновления задания. Один из подходов заключается в копировании нового скрипта с тем же именем и тем же местоположением, которые использует ваше ранее существующее задание ETL, а затем запускает ваш ETL с помощью start-job API как часть процесса CI.

Второй подход заключается в непосредственном запуске вашего ETL и принудительном использовании последнего скрипта в вызове API запуска задания:

 aws glue start-job-run --job-name <job-name> --arguments=scriptLocation="<path to your latest script>"
 

Единственное предостережение при втором подходе заключается в том, что при просмотре в консоли задание ETL по-прежнему будет ссылаться на старое местоположение скрипта. Приведенная выше команда просто заставляет этот запуск задания использовать последний сценарий, который вы можете подтвердить, просмотрев вкладку «История» на консоли Glue ETL.

Комментарии:

1. В моем случае это невозможно: 1) копирование нового скрипта в том же месте S3 не включило бы управление версиями, и это своего рода цель 2) планировщик не должен знать, какая версия развернута в данный момент (просто для выполнения скрипта). Спасибо

2. Да, вы потеряете возможность управления версиями, скопировав в то же место. Вы можете использовать API create-job для создания нового задания, которое указывает на новое местоположение, и удалять старое при каждом запуске сценария развертывания. Это не лучший способ, но он даст вам возможность управления версиями, пока AWS не предоставит способ использовать API-интерфейс обновления заданий для изменения только местоположения скрипта.