#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-интерфейс обновления заданий для изменения только местоположения скрипта.