[新機能] AWS Glue 「Glue Version 2.0」のSpark ETL ジョブの開始時間が10倍速く、最小の請求時間は1分になりました!
新たにリリースされた「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)を使用して追加のモジュールをインストールできるようになったので、後日こちらも検証したいと思います。