Glue Python shell jobの処理時間の履歴を取得する

2020.09.24

この記事は公開されてから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」の項目が追加され、 起動処理の時間が表示されるようになりました。

ですが、やはり集計を行うためには、今回紹介したワンライナーのような形で、 データが取得できることが望ましいと考えます。この記事が、データ分析基盤のジョブの、パフォーマンス計測のお役に立てれば幸いです。