AWS Glue 2.0 ETL ジョブで外部 Python ライブラリを使用するにはどうすればよいですか?
最終更新日: 2022 年 3 月 11 日
AWS Glue 2.0 の抽出、変換、ロード (ETL) ジョブで外部 Python ライブラリを使用したいと考えています。
解決方法
AWS Glue バージョン 2.0 を使用して、ジョブレベルで追加の Python モジュールまたは異なるバージョンをインストールできます。新しいモジュールを追加したり、既存のモジュールのバージョンを変更したりするには、--additional-python-modules ジョブパラメータキーを使用して、カンマで区切られた Python モジュールのリストを含む値を指定します。これにより、AWS Glue 2.0 ETL ジョブが Python パッケージインストーラ (pip3) を使用して追加のモジュールをインストールできるようになります。
AWS Glue ジョブ用の追加の Python モジュールをインストールするには:
- AWS Glue コンソールを開きます。
- ナビゲーションペインで、[Jobs] (ジョブ) を選択します。
- Python モジュールを追加するジョブを選択します。
- [Actions] (アクション) を選択してから、[Edit job] (ジョブの編集) を選択します。
- [Security configuration, script libraries, and job parameters (optional)] (セキュリティ設定、スクリプトライブラリ、およびジョブパラメータ (オプション)) セクションを展開します。
- [Job parameters] (ジョブパラメータ) で、次の操作を行います。
[Key] (キー) で、--additional-python-modules と入力します。
[Value] (値) で、pymysql==1.0.2, s3://aws-glue-add-modules/nltk-3.6.2-py3-none-any.whl と入力します。 - [Save] (保存) を選択します。
次の手順では、2 つの異なるモジュールをインストールする場合の例を示します。
- インターネット経由の PyMySQL
- Amazon Simple Storage Service (Amazon S3) の wheel ファイルからの自然言語ツールキット (NLTK)
新しいモジュールをインストールするか、既存のモジュールを更新するには、モジュール関連の依存関係をダウンロードする必要があります。つまり、これらのタスクのいずれかを完了するには、インターネットアクセスが必要です。インターネットにアクセスできない場合は、Building Python modules from a wheel for Spark ETL workloads using AWS Glue 2.0 を参照してください。
AWS Glue 2.0 で既に提供されている他の Python モジュールのリストについては、Python modules already provided in AWS Glue version 2.0 を参照してください。
C で書かれたライブラリと拡張モジュールも、--additional-python-modules オプションを使用して AWS Glue 2.0 でサポートされています。ただし、spacy や grpc などの Python モジュールのサブセットをインストールするには root 許可が必要です。root 許可がないと、インストール中にこれらのモジュールのコンパイルが失敗します。AWS Glue は、パッケージのインストール中に root アクセスを提供しません。これは、バイナリを AWS Glue と互換性のある wheel にプリコンパイルし、その wheel をインストールすることで解決できます。
C ベースの言語でライブラリをコンパイルするには、コンパイラがターゲットオペレーティングシステムおよびプロセッサアーキテクチャと互換性がある必要があります。ライブラリが別のオペレーティングシステムまたはプロセッサアーキテクチャに対してコンパイルされている場合、wheel は AWS Glue にインストールされません。AWS Glue はマネージドサービスであるため、クラスターアクセスを使用してこれらの依存関係を展開することはできません。root 許可を必要とする C ベースの Python モジュールをプリコンパイルするには、次の操作を行います。
注: 次の手順では、grpcio モジュールのインストールの例を示します。
1. ライブラリ用の十分なボリュームスペースを備えた Amazon Elastic Compute Cloud (Amazon EC2) Linux インスタンスを起動します。
2. インスタンスに Docker コンテナをインストールし、非 sudo アクセスを設定し、Docker を起動します。
sudo yum install docker -y
sudo usermod -a -G docker ec2-user
sudo service docker start
3. dockerfile_grpcio ファイルを作成し、次をファイルにコピーします。
# Base for AWS Glue
FROM amazonlinux
RUN yum update -y
RUN yum install shadow-utils.x86_64 -y
RUN yum install -y java-1.8.0-openjdk.x86_64
RUN yum install -y python3
RUN yum install -y cython doxygen numpy scipy gcc autoconf automake libtool zlib-devel openssl-devel maven wget protobuf-compiler cmake make gcc-c++
# Additional components needed for grpcio
WORKDIR /root
RUN yum install python3-devel -y
RUN yum install python-devel -y
RUN pip3 install wheel
# Install grpcio and related modules
RUN pip3 install Cython
RUN pip3 install cmake scikit-build
RUN pip3 install grpcio
# Create a directory for the wheel
RUN mkdir wheel_dir
# Create the wheel
RUN pip3 wheel grpcio -w wheel_dir
4. Docker ビルドを実行して Dockerfile をビルドします。次のコマンドを実行して Docker デーモンを再起動します。
$ sudo service docker restart
$ docker build -f dockerfile_grpcio .
docker build コマンドが完了すると、Docker イメージ ID と共に成功メッセージが表示されます。例えば、「1111222233334444 を正常に構築しました」。 次のステップで使用する Docker イメージ ID をメモしておきます。
5. Docker コンテナから wheel ファイルを抽出します。次のコマンドを実行して、.whl ファイルを抽出します。
# Get the docker image ID
$ docker image ls
# Run the container
$ docker run -dit 111122223334444
# Verify the location of the wheel file and retrieve the name of the wheel file
$ docker exec -t -i 5555666677778888 ls /root/wheel_dir/
# Copy the wheel out of docker to EC2
$ docker cp 5555666677778888:/root/wheel_dir/doc-example-wheel .
前述のコマンドの次の値を必ず置き換えてください。
- 1111222233334444: Docker イメージ ID と置き換えます
- 5555666677778888: コンテナ ID と置き換えます
- doc-example-wheel: 生成された wheel ファイルの名前と置き換えます
6. 次のコマンドを実行して、wheel を Amazon S3 にアップロードします。
aws s3 cp doc-example-wheel s3://path/to/wheel/
aws s3 cp grpcio-1.32.0-cp37-cp37m-linux_x86_64.whl s3://aws-glue-add-modules/grpcio/
前述のコマンドの次の値を必ず置き換えてください。
- doc-example-wheel: 生成された wheel ファイルの名前と置き換えます
- grpcio-1.32.0-cp37-cp37m-linux_x86_64.whl: Python パッケージファイルの名前と置き換えます
7. AWS Glue ETL ジョブの場合は、AWS Glue コンソールの [Job parameters] (ジョブパラメータ) で次の操作を実行します。[Key] (キー) で、--additional-python-modules と入力します。
[Value] (値) で、s3://aws-glue-add-modules/grpcio/grpcio-1.32.0-cp37-cp37m-linux_x86_64.whl と入力します。
注: 必ず 、grpcio-1.32.0-cp37-cp37m-linux_x86_64.whl を Python パッケージファイルの名前に置き換えてください。
重要: AWS Glue バージョン 0.9 および 1.0 は、C で書かれた Python モジュールをサポートしていません。AWS Glue 0.9 および 1.0 に外部 Python ライブラリをインストールするには、AWS Glue 1.0 または 0.9 ETL ジョブで外部 Python ライブラリを使用するにはどうすればよいですか? を参照してください。