この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
いわさです。
Glue Studioを使うと、ビジュアルエディターを使ってGlueジョブを作成することが出来ます。
これまでは、ビジュアルエディターで表示されるジョブをCLIやAPIで作成したり更新したりすることが出来なかったのですが、本日のアップデートでAPIで管理出来るようになりました。
今までもプレビューとして利用出来ていたのですが、今回GAとなりました。
やってみる
ビジュアルから
まずはGlue Studioのビジュアルエディターを使ってジョブを作成し挙動を確認してみましょう。
2つのS3バケットを作成し、バケットAにCSVをアップロードしておきます。
ETLジョブを使って、フィールドを削除したCSVをバケットBに格納してみます。
before.csv
aaa,bbb,ccc
111,222,333
100,200,300
ビジュアルエディターでは「ノード」を使ってデータフローを作成します。
ここではソース定義、データの編集、ターゲット定義と3つのノードを定義しています。データ編集ではbbb
というフィールドの削除だけをしています。非常に単純なETL処理です。
作成したジョブをRunしてみると、バケットBに加工されたCSVファイルが格納されていることが確認出来るかと思います。
APIから
では、今回はAWS CLIを使って、ビジュアルジョブを作成してみます。
ここでは理解しやすそうなシナリオとして、先程手動でビジュアルエディターから作成したジョブを少し編集してコピーしてみたいと思います。
AWS CLIのv1.24.2/v2.7.1からこれらの操作が可能になっています。
具体的には、既存のcreate-job
やget-job
にCodeGenConfigurationNodes
というオプションが追加されています。
$ aws glue get-job --job-name "hoge drop field"
{
"Job": {
"Name": "hoge drop field",
"Description": "",
"Role": "arn:aws:iam::123456789012:role/hoge0520glueadmin",
:
"GlueVersion": "3.0",
"CodeGenConfigurationNodes": {
"node-1652998518357": {
"DropFields": {
"Name": "Drop Fields",
"Inputs": [
"node-1652998005655"
],
"Paths": [
[
"bbb"
]
]
}
},
"node-1652998530102": {
"S3DirectTarget": {
"Name": "Amazon S3",
"Inputs": [
"node-1652998518357"
],
"PartitionKeys": [],
"Path": "s3://hoge0520iwasatarget",
"Compression": "none",
"Format": "csv",
"SchemaChangePolicy": {
"EnableUpdateCatalog": false
}
}
},
"node-1652998005655": {
"S3CsvSource": {
"Name": "Amazon S3",
"Paths": [
"s3://hoge0520iwasasource/before.csv"
],
"Exclusions": [],
"Recurse": true,
"AdditionalOptions": {
"EnableSamplePath": false,
"SamplePath": "s3://hoge0520iwasasource/before.csv"
},
"Separator": "comma",
"Escaper": "",
"QuoteChar": "quote",
"WithHeader": true,
"OptimizePerformance": false,
"OutputSchemas": [
{
"Columns": [
{
"Name": "aaa",
"Type": "bigint"
},
{
"Name": "bbb",
"Type": "bigint"
},
{
"Name": "ccc",
"Type": "bigint"
}
]
}
]
}
}
}
}
}
このオプションを少し加工して以下のような形式でコピー用のCodeGenConfigurationNodes
を作成しておきます。
手動で作成したものから名前や削除するフィールドを変更しています。
hoge-config.json
{
"hoge-node-1": {
"S3CsvSource": {
"Name": "hoge-node-1",
"Paths": [
"s3://hoge0520iwasasource/before.csv"
],
"Exclusions": [],
"Recurse": true,
"AdditionalOptions": {
"EnableSamplePath": false,
"SamplePath": "s3://hoge0520iwasasource/before.csv"
},
"Separator": "comma",
"Escaper": "",
"QuoteChar": "quote",
"WithHeader": true,
"OptimizePerformance": false,
"OutputSchemas": [
{
"Columns": [
{
"Name": "aaa",
"Type": "bigint"
},
{
"Name": "bbb",
"Type": "bigint"
},
{
"Name": "ccc",
"Type": "bigint"
}
]
}
]
}
},
"hoge-node-2": {
"DropFields": {
"Name": "hoge name 2",
"Inputs": [
"hoge-node-1"
],
"Paths": [
[
"ccc"
]
]
}
},
"hoge-node-3": {
"S3DirectTarget": {
"Name": "hoge name 3",
"Inputs": [
"hoge-node-2"
],
"PartitionKeys": [],
"Path": "s3://hoge0520iwasatarget",
"Compression": "none",
"Format": "csv",
"SchemaChangePolicy": {
"EnableUpdateCatalog": false
}
}
}
}
あとは、CreateJobコマンドでパラメータとして渡すだけです。
IAMロールは先程手動で作成した時に利用したものを使っています。
$ aws glue create-job --name hoge-job-from-cli --role "arn:aws:iam::123456789012:role/hoge0520glueadmin" --command '{"Name":"glueetl","ScriptLocation":"s3://aws-glue-assets-123456789012-ap-northeast-1/scripts/hoge-fuga.py","PythonVersion":"3"}' --code-gen-configuration-nodes file://hoge-config.json --glue-version 3.0
{
"Name": "hoge-job-from-cli"
}
Glue Studioのジョブ一覧でジョブが作成されたことが確認出来ます。
あとは通常どおり実行してみます。
$ aws glue start-job-run --job-name hoge-job-from-cli
{
"JobRunId": "jr_56ccbd2910b42cc925e9b159571bf1169ecfb2fe734e1927f5cfe7100c31e21d"
}
$ aws glue get-job-run --job-name hoge-job-from-cli --run-id jr_56ccbd2910b42cc925e9b159571bf1169ecfb2fe734e1927f5cfe7100c31e21d
{
"JobRun": {
"Id": "jr_56ccbd2910b42cc925e9b159571bf1169ecfb2fe734e1927f5cfe7100c31e21d",
"Attempt": 0,
"JobName": "hoge-job-from-cli",
"StartedOn": "2022-05-20T09:37:15.728000+09:00",
"LastModifiedOn": "2022-05-20T09:37:19.041000+09:00",
"JobRunState": "RUNNING",
"PredecessorRuns": [],
"AllocatedCapacity": 10,
"ExecutionTime": 13,
"Timeout": 2880,
"MaxCapacity": 10.0,
"WorkerType": "G.1X",
"NumberOfWorkers": 10,
"LogGroupName": "/aws-glue/jobs",
"GlueVersion": "3.0"
}
}
$ aws glue get-job-run --job-name hoge-job-from-cli --run-id jr_56ccbd2910b42cc925e9b159571bf1169ecfb2fe734e1927f5cfe7100c31e21d
{
"JobRun": {
"Id": "jr_56ccbd2910b42cc925e9b159571bf1169ecfb2fe734e1927f5cfe7100c31e21d",
"Attempt": 0,
"JobName": "hoge-job-from-cli",
"StartedOn": "2022-05-20T09:37:15.728000+09:00",
"LastModifiedOn": "2022-05-20T09:38:23.006000+09:00",
"CompletedOn": "2022-05-20T09:38:23.006000+09:00",
"JobRunState": "SUCCEEDED",
"PredecessorRuns": [],
"AllocatedCapacity": 10,
"ExecutionTime": 60,
"Timeout": 2880,
"MaxCapacity": 10.0,
"WorkerType": "G.1X",
"NumberOfWorkers": 10,
"LogGroupName": "/aws-glue/jobs",
"GlueVersion": "3.0"
}
}
ジョブが成功しました。
出力されたCSVファイルを確認してみましょう。
aaa,bbb
111,222
100,200
期待どおりccc
列が削除されたCSVファイルがターゲットとして定義されていたバケットBへ格納されていますね。
さいごに
本日はAWS CLIを使ってGlue Studioのビジュアルジョブを作成してみました。
このアップデートによってAWSアカウント間でジョブのコピーや定義の共有が出来るようになりました。アップデートドキュメントでは他のETLツールとAWS Glueの間での変換などの際にAPIを利用するユースケースなども想定されていました。