[新機能] AWS Glue 「Glue Version 2.0」のSpark ETL ジョブの開始時間が10倍速く、最小の請求時間は1分になりました!

2020.08.11

新たにリリースされた「Glue Version 2.0」では、Sparkジョブの開始時間が10倍速く、最低10分ではなく最低1分の1秒単位で請求になります。インタラクティブなマイクロバッチをより素早くコスト効率よく実行できるようになりました。さらに新しいPythonモジュールの追加・更新、Pythonパッケージインストーラー(pip3)を使用して追加のモジュールをインストールもサポートされました。

本日は、「Glue Version 2.0」のSparkジョブの利用方法と起動時間について実際に確認してみます。

AWSJ亀田さんの記事ですが、「世界の亀田さん」なので、執筆時点では英語のみです。

新しい Glue Version 2.0 - Spark ETL ジョブ

Glue Version 2.0 - Spark ETL ジョブの選択

Spark ETL ジョブでは、新しいSaprk 2.4, Python 3 with improved job startup times(Glue Version 2.0)がデフォルトで設定されるようになりました。(執筆時点では、Spark Streaming、Python Shellはサポートされていません。)

ジョブレベルでの追加のPythonモジュールの指定のサポート

Glueバージョン2.0では、ジョブレベルで追加のPythonモジュールまたは異なるバージョンを提供することもできます。この--additional-python-modulesオプションをコンマ区切りのPythonモジュールのリストと共に使用して、新しいモジュールを追加したり、既存のモジュールのバージョンを変更したりできます。

新しいskit-learnモジュールを更新または追加するには

--additional-python-modules scikit-learn==0.21.3

--additional-python-modulesオプション内で、PythonホイールモジュールへのAmazon S3パスを指定できます。

--additional-python-modules s3://aws-glue-native-spark/tests/j4.2/ephem-3.7.7.1-cp37-cp37m-linux_x86_64.whl,s3://aws-glue-native-spark/tests/j4.2/fbprophet-0.6-py3-none-any.whl

AWS Glueは、Pythonパッケージインストーラー(pip3)を使用して追加のモジュールをインストールするには、python-modules-installer-optionに、pip3に指定された追加オプションを指定します。

Glue Version 2.0 でサポートするPython モジュール

以下のPython モジュールをサポートしています。

  • setuptools—45.2.0
  • setuptools—45.2.0
  • subprocess32—3.5.4
  • ptvsd—4.3.2
  • pydevd—1.9.0
  • PyMySQL—0.9.3
  • docutils—0.15.2
  • jmespath—0.9.4
  • six—1.14.0
  • python_dateutil—2.8.1
  • urllib3—1.25.8
  • botocore—1.15.4
  • s3transfer—0.3.3
  • boto3—1.12.4
  • certifi—2019.11.28
  • chardet—3.0.4
  • idna—2.9
  • requests—2.23.0
  • pyparsing—2.4.6
  • enum34—1.1.9
  • pytz—2019.3
  • numpy—1.18.1
  • cycler—0.10.0
  • kiwisolver—1.1.0
  • scipy—1.4.1
  • pandas—1.0.1
  • pyarrow—0.16.0
  • matplotlib—3.1.3
  • pyhocon—0.3.54
  • mpmath—1.1.0
  • sympy—1.5.1
  • patsy—0.5.1
  • statsmodels—0.11.1
  • fsspec—0.6.2
  • s3fs—0.4.0
  • Cython—0.29.15
  • joblib—0.14.1
  • pmdarima—1.5.3
  • scikit-learn—0.22.1
  • tbats—1.0.9

Logging 動作

Glue Version 2.0では、ロギングはリアルタイムで行われます。ドライバーと各エグゼキューターはそれぞれ出力ストリームとエラーストリームに出力されます。

開始時間 三本勝負:Glue 1.0 vs Glue 2.0

Glue 1.0:Sprk2.4, Python 3(Glue Version 1.0) と Glue 2.0:Saprk 2.4, Python 3 with improved job startup times(Glue Version 2.0)にて、開始時間を計測しました。クラスタを再利用されないように、それぞれ3つのジョブを作成してほぼ同時に実行します。DPU(10)やその他の設定はデフォルト値とします。

開始時間をget-job-runsでは取得できなかったため、マネジメントコンソールのStart-up timeの値を計測値とさせていただきます。60秒以上の値は単位が分で表示されるため60秒換算で記載しています。

ジョブ1の
開始時間(sec)
ジョブ2の
開始時間(sec)
ジョブ3の
開始時間(sec)
開始時間の
平均(sec)
Glue 1.0 420 600 720 580
Glue 2.0 9 8 9 8.6
67.4倍の改善

今回の検証結果では、67.4倍の改善(10倍どころじゃないやん)でした。

念の為、エビデンスを残しておきます。

Glue 1.0:1回目

Glue 1.0:2回目

Glue 1.0:3回目

Glue 2.0:1回目

Glue 2.0:2回目

Glue 2.0:3回目

最後に

Sparkジョブの「Glue Version 2.0」を採用することで、起動までの時間が短縮してGlue Workflowのオーバーヘッドは軽減され、最小の請求時間は1分になりマイクロバッチのコスト効率の改善が期待できます。アーキテクチャの変更について具体的な言及はありませんが、Apache YARNでは実行されないとマニュアルに記載があることから、リソースマネージャの変更があったようです。動的割り当てを使用しないため、ExecutorAllocationManagerメトリックは使用できません。

上記以外にも、Glue Version 2.0 はサポートするPython モジュールが追加・更新されました。個人的には念願のpyarrowが使えるようになったので嬉しいです。Pythonパッケージインストーラー(pip3)を使用して追加のモジュールをインストールできるようになったので、後日こちらも検証したいと思います。

参考