Glue Python shell jobの処理時間の履歴を取得する
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」の項目が追加され、 起動処理の時間が表示されるようになりました。
ですが、やはり集計を行うためには、今回紹介したワンライナーのような形で、 データが取得できることが望ましいと考えます。この記事が、データ分析基盤のジョブの、パフォーマンス計測のお役に立てれば幸いです。