【发布时间】:2023-03-21 14:51:01
【问题描述】:
我有大量客户提供相同格式的数据,并且需要将它们加载到不同数据库中的相同表中。我已经在 Glue 中为他们设置了一份工作,但现在我必须再做 20 次同样的事情
有什么方法可以获取现有作业并复制它,但要更改 S3 文件路径和 JDBC 连接?
我无法在网上找到很多关于 AWS Glue 中的脚本的信息。这可以通过 AWS 命令行界面实现吗?
【问题讨论】:
标签: amazon-web-services aws-glue
我有大量客户提供相同格式的数据,并且需要将它们加载到不同数据库中的相同表中。我已经在 Glue 中为他们设置了一份工作,但现在我必须再做 20 次同样的事情
有什么方法可以获取现有作业并复制它,但要更改 S3 文件路径和 JDBC 连接?
我无法在网上找到很多关于 AWS Glue 中的脚本的信息。这可以通过 AWS 命令行界面实现吗?
【问题讨论】:
标签: amazon-web-services aws-glue
最快的方法是使用 aws cli。
aws glue get-job --job-name <value>
其中 value 是您尝试复制的特定作业。然后,您可以更改上述命令返回的 JSON 中的 s3 路径和 JDBC 连接信息。此外,您需要给它一个新的唯一名称。完成后,您可以将其传递给:
aws glue create-job --cli-input-json <value>
其中 value 是您尝试从中创建新作业的更新后的 JSON。
有关胶水命令行的更多信息,请参阅AWS command line reference
【讨论】:
使用命令
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 (string) 根据提供的 JSON 字符串执行服务操作。 JSON 字符串遵循 --generate-cli-skeleton 提供的格式。如果在命令行上提供了其他参数,则 CLI 值将覆盖 JSON 提供的值。无法使用 JSON 提供的值传递任意二进制值,因为字符串将按字面意思获取。
--generate-cli-skeleton (string) 将 JSON 骨架打印到标准输出,而不发送 API 请求。如果未提供值或值输入,则打印可用作 --cli-input-json 参数的示例输入 JSON。如果提供值输出,它会验证命令输入并返回该命令的示例输出 JSON。
【讨论】:
感谢此处提供的出色答案,您已经知道 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。现在您可以对其进行编辑以根据需要更改字段。首先当然是改名字!
需要注意的两点:
移除 JSON 的外层,我们需要 Job 的 值 而不是 Job 标识符本身。如果您查看上面创建的job_template.json,您会发现它必须以Name 开头,所以这是一个小的修改以符合格式要求。
job_template.json 中也没有 CreatedOn 或 LastModifiedOn,所以我们也删除这些行。不用担心,如果您忘记删除它们,创建将失败并显示一个有用的消息,例如 'Parameter validation failed: Unknown parameter in input: "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) 操作:如果使用 Worker Type,请不要设置 Allocated Capacity 和工人人数。
很好。我删除了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 非常强大,不仅方便,而且还允许在 Jenkins 等持续集成 (CI) 服务器中实现自动化。运行aws glue help 获取更多命令和快速帮助,或查看online documentation 了解更多详细信息。
要创建或管理永久性基础架构,最好使用基础架构即代码工具,例如 CloudFormation 或 Terraform。
【讨论】: