Amazon Web Services ブログ
Docker コンテナを使って AWS Glue 5.0 のジョブをローカルで開発・テストする
AWS Glue は、さまざまなデータソースからのデータを大規模に処理・統合できるサーバーレスのデータ統合サービスです。Apache Spark ジョブ用の最新バージョンである AWS Glue 5.0 は、バッチ処理とストリーム処理に最適化された Apache Spark 3.5 ランタイム環境を提供します。AWS Glue 5.0 を使えば、パフォーマンスの向上、セキュリティの強化、次世代の Amazon SageMaker のサポート、その他の機能強化が得られます。AWS Glue 5.0 により、データ統合ワークロードの開発、実行、スケーリングが可能になり、より迅速にインサイトを得られるようになります。
AWS Glue は、複数のジョブ作成アプローチを通じて、さまざまな開発方法に対応しています。ダイレクトコーディングがお好きな開発者の方は、AWS Glue ETL ライブラリを使用した Python または Scala での開発が可能です。
本番環境に耐えうるデータプラットフォームを構築するには、堅牢な開発プロセスと継続的インテグレーションおよびデリバリー (CI/CD) パイプラインが必要です。ローカルマシン、Amazon Elastic Compute Cloud (Amazon EC2) 上の Docker コンテナ、その他の環境など、さまざまな開発ニーズに対応するため、AWS は Amazon ECR Public Gallery を通じて公式の AWS Glue Docker イメージを提供しています。このイメージにより、開発者の方は AWS Glue ETL ライブラリを使用しながら、お好きな環境で効率的に作業できます。
この記事では、Docker コンテナを使用して AWS Glue 5.0 ジョブをローカルで開発およびテストする方法を示します。この記事は、Develop and test AWS Glue version 3.0 and 4.0 jobs locally using a Docker container の更新版で、AWS Glue 5.0 を使用しています。
利用可能な Docker イメージ
以下の Docker イメージが Amazon ECR Public Gallery で利用可能です:
- AWS Glue バージョン 5.0 –
ecr.aws/glue/aws-glue-libs:5
AWS Glue の Docker イメージは、x86_64
と arm64
の両方に対応しています。
この記事では、public.ecr.aws/glue/aws-glue-libs:5
を使用し、コンテナをローカルマシン (Mac、Windows、Linux) 上で実行します。このコンテナイメージは、AWS Glue 5.0 の Spark ジョブでテストされています。このイメージには以下が含まれています。
- Amazon Linux 2023
- AWS Glue ETL ライブラリ
- Apache Spark 3.5.4
- Open table format ライブラリ: Apache Iceberg 1.7.1、Apache Hudi 0.15.0、Delta Lake 3.3.0
- AWS Glue Data Catalog クライアント
- Apache Spark 用 Amazon Redshift コネクタ
- Apache Hadoop 用 Amazon DynamoDB コネクタ
コンテナをセットアップするには、ECR Public Gallery からイメージを pull し、コンテナを実行します。要件に応じて、次の方法でコンテナの実行方法を示します:
spark-submit
- REPL シェル (
pyspark
) pytest
- Visual Studio Code
前提条件
始める前に、Docker がインストールされていて Docker デーモンが実行中であることを確認してください。インストール手順については、Mac、Windows、または Linux 向けの Docker ドキュメントを参照してください。また、Docker を実行しているホストに少なくとも 7GB のディスク領域があることを確認してください。
AWS 認証情報の設定
コンテナから AWS API 呼び出しを有効にするには、次の手順で AWS 認証情報を設定します。
- AWS 名前付きプロファイルを作成します。
- Windows では cmd を、Mac/Linux では端末を開き、次のコマンドを実行します:
次のセクションでは、この AWS 名前付きプロファイルを使用します。
ECR Public Gallery からイメージを pull
Docker を Windows で実行している場合は、イメージを pull する前に Docker アイコンを右クリックし、Linux コンテナに切り替えるを選択してください。
ECR Public Gallery からイメージを pull するには、次のコマンドを実行してください:
コンテナの実行
これで、このイメージを使ってコンテナを実行できます。要件に応じて、以下のいずれかの方法を選択できます。
spark-submit
AWS Glue ジョブスクリプトは、コンテナ上で spark-submit
コマンドを実行することで実行できます。
ジョブスクリプト (sample.py
の例) を書き、次のコマンドを使って /local_path_to_workspace/src/
ディレクトリに保存してください:
これらの変数は、次の docker run
コマンドで使用されます。spark-submit
コマンドで使用されるサンプルコード (sample.py
) は、この記事の最後の Appendix に含まれています。
次のコマンドを実行して、コンテナ上で spark-submit
コマンドを実行し、新しい Spark アプリケーションを送信します:
REPL シェル (pyspark)
REPL (read-eval-print loop) シェルを使用すると、インタラクティブな開発ができます。コンテナ上で pyspark コマンドを実行し、REPL シェルを起動するには、次のコマンドを実行します。
次の出力が表示されます:
この REPL シェルを使えば、対話的にコーディングとテストができます。
pytest
単体テストには、AWS Glue Spark ジョブスクリプトに対して pytest
を使用できます。
次のコマンドを実行して準備をしてください:
次に、docker run
を使って pytest
を呼び出しましょう:
pytest
がユニットテストの実行を終えると、出力は次のようになります:
Visual Studio Code
Visual Studio Code でコンテナを設定するには、以下の手順を実行してください:
- Visual Studio Code をインストールしてください。
- Python をインストールしてください。
- Dev Containers をインストールしてください。
- Visual Studio Code でワークスペースフォルダを開いてください。
- Ctrl+Shift+P (Windows/Linux) または Cmd+Shift+P (Mac) を押してください。
Preferences: Open Workspace Settings (JSON)
と入力してください。- Enter を押してください。
- 次の JSON を入力して保存してください。
これで、コンテナのセットアップの準備ができました。
- Docker コンテナを実行します:
- Visual Studio Code を起動します。
- ナビゲーションペインで Remote Explorer を選択します。
- コンテナ
ecr.aws/glue/aws-glue-libs:5
を右クリックし、Attach in Current Window を選択します。
-
- 次のダイアログが表示された場合は Got it を選択してください。
/home/hadoop/workspace/
を開いてください。
- AWS Glue の PySpark スクリプトを作成し、Run を選択します。
AWS Glue の PySpark スクリプトが正常に実行されたことが確認できるはずです。
AWS Glue 4.0 と AWS Glue 5.0 の Docker イメージ間の変更点
AWS Glue 4.0 と Glue 5.0 の Docker イメージ間の主な変更点は次のとおりです。
- AWS Glue 5.0 では、バッチジョブとストリーミングジョブの両方に単一のコンテナイメージが使用されます。これは AWS Glue 4.0 とは異なり、4.0 ではバッチ用とストリーミング用に別々のイメージがありました。
- AWS Glue 5.0 では、コンテナのデフォルトユーザー名は hadoop です。AWS Glue 4.0 では、デフォルトユーザー名は glue_user でした。
- AWS Glue 5.0 では、JupyterLab や Livy などのいくつかの追加ライブラリがイメージから削除されています。手動でインストールすることができます。
- AWS Glue 5.0 では、Iceberg、Hudi、Delta ライブラリがすべてデフォルトで事前ロードされており、環境変数
DATALAKE_FORMATS
は不要になりました。AWS Glue 4.0 までは、環境変数DATALAKE_FORMATS
を使用して、特定のテーブル形式がロードされるかどうかを指定していました。
前述のリストは Docker イメージに固有のものです。AWS Glue 5.0 の更新について詳しくは、Introducing AWS Glue 5.0 for Apache Spark および Migrating AWS Glue for Spark jobs to AWS Glue version 5.0 をご覧ください。
考慮事項
AWS Glue コンテナイメージを使用してジョブスクリプトをローカルで開発する際、以下の機能はサポートされていないことに注意してください:
- ジョブのブックマーク
- AWS Glue Parquet writer (参照: AWS Glue での Parquet 形式の使用)
- FillMissingValues 変換
- FindMatches 変換
- ベクトル化された SIMD CSV リーダー
- Amazon Simple Storage Service (Amazon S3) のパスから JDBC ドライバーをロードするための customJdbcDriverS3Path プロパティ
- AWS Glue Data Quality
- 機密データの検出
- AWS Lake Formation の権限ベースのクレデンシャル発行
結論
この投稿では、AWS Glue 5.0 Docker イメージが、お好みの環境で AWS Glue ジョブスクリプトを開発およびテストするための柔軟な基盤を提供することをご紹介しました。Amazon ECR Public Gallery で簡単に入手できるこれらのイメージは、AWS Glue ジョブの開発に一貫したポータブルな環境を提供することで、開発プロセスを合理化します。
エンドツーエンドの開発パイプラインの構築方法の詳細については、End-to-end development lifecycle for data engineers to build a data integration pipeline using AWS Glue をご覧ください。これらの機能を活用し、AWS コミュニティで知見を共有することをお勧めします。
Appendix A: AWS Glue ジョブのテスト用サンプルコード
この Appendix では、テスト目的で AWS Glue ジョブのサンプルコードとして 3 つの異なるスクリプトを紹介します。チュートリアルではこれらのいずれかを使用できます。
以下の sample.py コードは、AWS Glue ETL ライブラリと Amazon Simple Storage Service (Amazon S3) の API 呼び出しを使用しています。このコードには、AWS Identity and Access Management (IAM) での Amazon S3 の権限が必要です。arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess の IAM 管理ポリシーか、S3 パスに対して ListBucket と GetObject の API 呼び出しを許可するカスタム IAM ポリシーを付与する必要があります。
以下の test_sample.py コードは、sample.py のユニットテストのサンプルです:
Appendix B: JDBC ドライバーと Java ライブラリの追加
コンテナ内に現在ない JDBC ドライバーを追加する場合は、ワークスペース内に必要な JAR ファイルを含む新しいディレクトリを作成し、そのディレクトリを docker run
コマンドで /opt/spark/jars/
にマウントします。コンテナ内の /opt/spark/jars/
以下にある JAR ファイルは、自動的に Spark クラスパスに追加され、ジョブ実行中に使用できるようになります。
たとえば、次の docker run
コマンドを使用して、JDBC ドライバーの jar ファイルを PySpark REPL シェルに追加できます:
前述のように、customJdbcDriverS3Path
接続オプションは、AWS Glue コンテナイメージにカスタム JDBC ドライバを Amazon S3 からインポートするために使用できません。
Appendix C: Livy と JupyterLab の追加
AWS Glue 5.0 コンテナイメージには、デフォルトで Livy がインストールされていません。AWS Glue 5.0 コンテナイメージを基本とする新しいコンテナイメージを作成できます。次の Dockerfile は、開発およびテスト体験を強化するために必要な追加コンポーネントを含めるように Docker イメージを拡張する方法を示しています。
始めるには、ワークステーションにディレクトリを作成し、そのディレクトリに Dockerfile.livy_jupyter
ファイルを配置します。
次のコードは Dockerfile.livy_jupyter
です:
Docker ビルドコマンドを実行してイメージをビルドします:
イメージのビルドが完了したら、次の docker run コマンドを使用して、新しく作成されたイメージを起動できます。
Appendix D: 追加の Python ライブラリの追加
このセクションでは、追加の Python ライブラリを追加し、Python パッケージをインストールする方法について説明します。
ローカル Python ライブラリ
ローカルの Python ライブラリを追加するには、ディレクトリに配置し、パスを $EXTRA_PYTHON_PACKAGE_LOCATION
に割り当ててください:
PYTHONPATH
にパスが追加されたことを検証するには、sys.path
にそのパスが存在するかどうかを確認できます:
Python パッケージの pip によるインストール
PyPI (または他のアーティファクトリポジトリ) からパッケージを pip でインストールするには、次のアプローチを使用できます。
本記事は、2025 年 3 月 12 日に公開された Develop and test AWS Glue 5.0 jobs locally using a Docker container を翻訳したものです。翻訳はソリューションアーキテクトの高橋が担当しました。