有没有一种简单的方法来克隆胶粘作业,但是更改数据库连接?

时间:2019-07-09 15:48:18

标签: amazon-web-services aws-glue

我有大量的客户以相同的格式提供数据,并且需要将它们加载到不同数据库中的相同表中。我已经在Glue中为他们设置了工作,但是现在我必须再做20次相同的事情

除了更改S3文件路径和JDBC连接之外,是否有其他方法可以执行现有作业并将其复制?

关于AWS Glue中的脚本编写,我找不到太多在线信息。通过AWS命令行界面可以实现吗?

3 个答案:

答案 0 :(得分:1)

使用命令

aws glue create-job --generate-cli-skeleton

生成框架JSON

使用以下命令获取现有作业的定义

aws glue get-job --job-name <value>

将现有作业定义输出中的值复制到框架中

删除换行符并将其作为输入传递给以下命令

aws glue create-job --cli-input-json <framed_JSON>

此处是创建作业AWS CLI文档的完整参考

https://docs.aws.amazon.com/cli/latest/reference/glue/create-job.html

PS:不要更改JSON(在框架中生成)中元素的顺序,仅更新连接和名称

-cli-input-json(字符串)根据提供的JSON字符串执行服务操作。 JSON字符串遵循--generate-cli-skeleton提供的格式。如果在命令行上提供了其他参数,则CLI值将覆盖JSON提供的值。无法使用JSON提供的值传递任意二进制值,因为该字符串将按字面意义使用。

-generate-cli-skeleton(字符串)在不发送API请求的情况下将JSON框架打印到标准输出。如果不提供值或值输入,则输出示例输入JSON,可用作--cli-input-json的参数。如果提供了值输出,它将验证命令输入并返回该命令的示例输出JSON。

答案 1 :(得分:0)

最快的方法是使用aws cli。

aws glue get-job --job-name <value>

其中value是您要复制的特定作业。然后,您可以在上述命令返回的JSON中更改s3路径和JDBC连接信息。另外,您需要为其赋予一个新的唯一名称。完成此操作后,您可以将其传递给:

aws glue create-job --cli-input-json <value>

其中的值是您尝试从中创建新作业的更新后的JSON。

有关胶水命令行的更多信息,请参见AWS command line reference

答案 2 :(得分:0)

多亏了这里的精彩回答,您已经知道 AWS CLI 可以派上用场了。

<块引用>

提示:如果您不想安装或更新 AWS CLI,只需使用 AWS CloudShell

我在这里使用版本测试了命令:

$ aws --version
aws-cli/1.19.14 Python/3.8.5 Linux/5.4.0-65-generic botocore/1.20.14

如果您想从头开始创建一个新作业,您首先需要一个模板,您可以使用该模板:

aws glue create-job --generate-cli-skeleton > job_template.json

然后使用您最喜欢的编辑器(我喜欢vim)在job_template.json(或任何您称之为)中填写详细信息。

但是如果 DuckDuckGo 或其他引擎将您发送到这里,那么您可能想要克隆和调整现有作业。在本指南中,我们将其称为“perfect_job”。

让我们获取所有工作的列表,以检查我们是否在正确的位置。

aws glue list-jobs --region us-east-1

输出显示了两个作业:

{
    "JobNames": [
        "perfect_job",
        "sunshine"
    ]
}

查看我们的工作:

aws glue get-job --job-name perfect_job --region us-east-1

JSON 输出看起来不错,让我们把它放在一个文件中以便我们可以编辑它:

aws glue get-job --job-name perfect_job --region us-east-1 > perfect_job.json

让我们将其 cp 写入一个新文件,例如 super_perfect_job.json。现在您可以编辑它以根据需要更改字段。第一件事当然是改名字!

注意两点:

  1. 移除 JSON 的外层,我们需要 Jobvalue 而不是 Job 标识符本身。如果您查看上面创建的 job_template.json,您会发现它必须以 Name 开头,因此这是一个符合格式要求的小修改。

  2. CreatedOn 中也没有 LastModifiedOnjob_template.json,所以让我们也删除这些行。别担心,如果您忘记删除它们,创建将失败,并显示一条有用的消息,例如'参数验证失败:输入中的未知参数:“LastModifiedOn”'

现在我们已准备好创建作业!以下示例将在开普敦地区添加 Glue 作业“super_perfect_job”:

aws glue create-job --cli-input-json file://super_perfect_job.json --region af-south-1

但这没有用:

<块引用>

调用 CreateJob 时发生错误 (InvalidInputException) 操作:请仅设置分配容量或最大容量。

我删除 MaxCapacity 并重试。还是不开心:

<块引用>

调用 CreateJob 时发生错误 (InvalidInputException) 操作:如果使用工人类型,请不要设置分配的容量 和工人数量。

好的。我删除 AllocatedCapacity 并再次尝试。这次的输出是:

{
    "Name": "super_perfect_job"
}

这意味着,成功!您可以通过再次运行 list-jobs 进行确认。打开 AWS 控制台并看到它在 Web UI 中弹出会更有意义。

我们迫不及待地想运行这个作业,所以我们也将使用 CLI,我们将传递三个额外的参数:--fruit--vegetable--nut我们的脚本期望。但是 -- 会混淆 AWS CLI,因此让我们将它们存储在名为 args.json 的文件中,其中包含:

{
  "--fruit": "tomato",
  "--vegetable": "cucumber",
  "--nut": "almond"
}

然后这样称呼我们的工作:

aws glue start-job-run --job-name super_perfect_job --arguments file://args.json --region af-south-1

或者像这样:

aws glue start-job-run --job-name super_perfect_job --arguments '{"--fruit": "tomato","--vegetable": "cucumber"}'

您可以通过以下方式查看作业运行的状态:

aws glue get-job-runs --job-name super_perfect_job --region us-east-1

如您所见,AWS CLI 访问的 AWS Glue API 非常强大,不仅方便,而且允许在持续集成 (CI) 服务器(例如 Jenkins)中实现自动化。运行 aws glue help 以获取更多命令和快速帮助,或查看 online documentation 以获取更多详细信息。

要创建或管理永久性基础设施,最好使用基础设施即代码工具,例如 CloudFormation 或 Terraform。