この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
DA事業本部の川崎です。
現在、私が参画している案件では、データ分析基盤のETL処理をGlueの「Python shell job」を使って実装しています。 今回、Python shell jobのパフォーマンスを計測する機会がありました。
Glueのマネジメントコンソールから、個別のジョブの実行履歴を参照できますが、実行時間の集計を行うのには不向きです。そこで、CLIのワンライナーを使い、CSVファイルの形式で取得してみます。
また、今回はGlue Python shell jobの、起動処理にかかる時間についても取得してみます。
利用するコマンドを確認
まずは、CLIのマニュアルを参照し、利用するコマンドを確認します。今回は、以下の2つのコマンドを利用します。
- CLIのマニュアル
list-jobs
でジョブの一覧を取得get-job-runs
でジョブ実行の履歴を取得
list-jobs
でジョブの一覧を取得し、実行履歴を取得するジョブの名前を確認します。(JobNames)
get-job-runs
の出力内容には、以下の項目が含まれます。
項目名 | データ型 | 詳細(英語) | 詳細(日本語) |
---|---|---|---|
StartedOn | timestamp | The date and time at which this job run was started. | ジョブ開始日時 |
CompletedOn | timestamp | The date and time that this job run completed. | ジョブ完了日時 |
ExecutionTime | integer | The amount of time (in seconds) that the job run consumed resources. | ジョブ実行時間(ジョブの実行がリソースを消費した時間[秒単位]) |
「起動処理にかかる時間」は、出力項目の中に見当たらないため、既存の項目から算出できるか、試してみます。
実際に出力される値を確認すると、
[CompletedOn] - [StartedOn]
の値が、[ExecutionTime]
よりも値が大きいことから、
[CompletedOn] - [StartedOn] - [ExecutionTime]
の値を、「起動処理にかかる時間」として扱うことにします。
CLIのワンライナーを組み立てる
get-job-runs
コマンドを実行し結果を確認しながら、ワンライナーを組み立てていきます。
aws glue get-job-runs --job-name "glue_job_xxx" | jq -r '.JobRuns[]'
{
"Id": "jr_xxxxxxxxxx9834fff7a166ca2f65172b68983ad1ba1fd231890b5915b936a356",
"Attempt": 0,
"JobName": "glue_job_xxx",
"StartedOn": 1600816132.498,
"LastModifiedOn": 1600816962.019,
"CompletedOn": 1600816962.019,
"JobRunState": "SUCCEEDED",
"Arguments": {
"--ENV": "dev"
},
"PredecessorRuns": [],
"AllocatedCapacity": 1,
"ExecutionTime": 779,
"Timeout": 2880,
"MaxCapacity": 1,
"LogGroupName": "/aws-glue/python-jobs"
},
...(略)
出力する項目をピックアップ
ジョブ開始日時、ジョブ完了日時はUnix時間形式、ジョブ実行時間は秒数で出力されています。
aws glue get-job-runs --job-name "glue_job_xxx" | jq -r '.JobRuns[] | [.JobName, .StartedOn, .CompletedOn, .ExecutionTime]'
[
"glue_job_xxx",
1600816132.498,
1600816962.019,
779
],
...(略)
日時をJSTに変換
ジョブ開始日時、ジョブ完了日時はUTCで返されるので、JSTに変換します。
JSTに変換するには、tonumber
を行って数値に変換した上で、
9h × 60min × 60sec = 32400
32400(秒)を足します。
aws glue get-job-runs --job-name "glue_job_xxx" | jq -r '.JobRuns[] | [.JobName, (.StartedOn |tonumber|.+32400|todate), (.CompletedOn |tonumber|.+32400|todate)]'
[
"glue_job_xxx",
"2020-09-23T08:08:52Z",
"2020-09-23T08:22:42Z"
],
...(略)
「起動処理にかかる時間」を求める
「起動処理にかかる時間」を、
[CompletedOn] - [StartedOn] - [ExecutionTime]
から算出します。
aws glue get-job-runs --job-name "glue_job_xxx" | jq -r '.JobRuns[] | [.JobName, (.CompletedOn |tonumber) - (.StartedOn |tonumber) - (.ExecutionTime|tonumber)]'
[
"glue_job_xxx",
50.521000146865845
],
...(略)
ジョブ実行ID、ジョブ実行の状態を追加
集計に必要な項目として、ジョブ実行ID、ジョブ実行の状態を追加します。
aws glue get-job-runs --job-name "glue_job_xxx" | jq -r '.JobRuns[] | [.JobName, (.StartedOn |tonumber|.+32400|todate), (.CompletedOn |tonumber) - (.StartedOn |tonumber) - (.ExecutionTime|tonumber),(.ExecutionTime|tonumber), .Id, .JobRunState]'
[
"glue_job_xxx",
"2020-09-23T08:08:52Z",
50.521000146865845,
779,
"jr_xxxxxxxxxx9834fff7a166ca2f65172b68983ad1ba1fd231890b5915b936a356",
"SUCCEEDED"
],
...(略)
CSV形式に変換
集計がしやすいように、JSON形式をCSV形式に変換します。
aws glue get-job-runs --job-name "glue_job_xxx" | jq -r '.JobRuns[] | [.JobName, (.StartedOn |tonumber|.+32400|todate), (.CompletedOn |tonumber) - (.StartedOn |tonumber) - (.ExecutionTime|tonumber),(.ExecutionTime|tonumber), .Id, .JobRunState]| @csv'
"glue_job_xxx","2020-09-23T08:08:52Z",50.521000146865845,779,"jr_xxxxxxxxxx9834fff7a166ca2f65172b68983ad1ba1fd231890b5915b936a356","SUCCEEDED"
"glue_job_xxx","2020-09-22T08:14:57Z",51.23900008201599,1056,"jr_xxxxxxxxxx9af086133aa7d90b0ceb2c352ecfebaad50308d46e8b034a89332e","SUCCEEDED"
...(略)
ヘッダーを付与
ファイルに出力した上で、先頭にヘッダーを付けておきます。
echo "JobName,StartedOn,InitSec,Id,JobRunState" > result1.csv
aws glue get-job-runs --job-name "glue_job_xxx" | jq -r '.JobRuns[] | [.JobName, (.StartedOn |tonumber|.+32400|todate), (.CompletedOn |tonumber) - (.StartedOn |tonumber) - (.ExecutionTime|tonumber),(.ExecutionTime|tonumber), .Id, .JobRunState]| @csv' >> result1.csv
JobName,StartedOn,InitSec,Id,JobRunState
"glue_job_xxx","2020-09-23T08:08:52Z",50.521000146865845,779,"jr_xxxxxxxxxx9834fff7a166ca2f65172b68983ad1ba1fd231890b5915b936a356","SUCCEEDED"
"glue_job_xxx","2020-09-22T08:14:57Z",51.23900008201599,1056,"jr_xxxxxxxxxx9af086133aa7d90b0ceb2c352ecfebaad50308d46e8b034a89332e","SUCCEEDED"
...(略)
まとめ
今回は、CLIのワンライナーで、Glue Python shell jobの実行履歴をCSV形式で取得してみました。
実は最近、Glueのマネジメントコンソール(ジョブ)画面に 「Start-up time」の項目が追加され、 起動処理の時間が表示されるようになりました。
ですが、やはり集計を行うためには、今回紹介したワンライナーのような形で、 データが取得できることが望ましいと考えます。この記事が、データ分析基盤のジョブの、パフォーマンス計測のお役に立てれば幸いです。