是否可以使用AWS CLI更新Glue作业的一部分?

时间:2019-04-17 16:06:33

标签: 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.

3 个答案:

答案 0 :(得分:2)

我不知道您是否已解决此问题,但我使用以下命令进行了管理:

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

您不需要角色的ARN,而是角色名称。上面的示例假定您具有名称为 myRoleNameBB 的角色,并且可以访问AWS Glue。

注意:我在笔记本电脑上使用了本地文件。另外,“命令”部分中的“名称”也是必填项。

运行它时,我将显示以下输出:

{
    "JobName": "<gluejobname>"
}

答案 1 :(得分:1)

通过 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>'

我也希望能帮助解决这个问题的人。

参考:

答案 2 :(得分:0)

根据我的发现,没有办法使用update-job API来仅更新部分工作。

我遇到了同样的问题,并且提供了克服该错误的作用。该命令有效,但update-job API实际上将其他参数重置为默认值,例如应用程序类型,作业语言,类,超时,最大容量等。

因此,如果您先前存在的作业是scala中的Spark应用程序,则该作业将失败,因为AWS默认将Python Shell和python作为作业语言作为update-job API的一部分。而且,此API无法将作业语言类型设置为scala并设置主类(在scala中是必需的)。它提供了一种将应用程序类型设置为Spark应用程序的方法。

如果您不想为update-job API指定角色。一种方法是使用与现有ETL作业相同的名称和位置复制新脚本,然后在CI流程中使用start-job API触发ETL。

第二种方法是直接运行ETL,并在开始作业API调用中强制其使用最新脚本:

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

第二种方法的唯一警告是,当您在控制台中查看时,ETL作业仍将引用旧脚本位置。上面的命令只是强制运行此作业以使用最新的脚本,您可以通过在Glue ETL控制台的“历史记录”选项卡中查看来确认。