AWS Glue ETL ジョブで外部 Python ライブラリを使用する方法を教えてください。
AWS Glue の抽出、変換、ロード (ETL) ジョブで外部 Python ライブラリを使用したいと考えています。
簡単な説明
AWS Glue バージョン 2.0、3.0、4.0 を使用する場合、ジョブレベルで追加の Python モジュールや異なるモジュールバージョンをインストールできます。新しいモジュールを追加したり、既存のモジュールのバージョンを変更したりするには、ジョブパラメータキー --additional-python-modules を使用します。キーの値は、カンマで区切られた Python モジュール名のリストです。このパラメータを使用すると、AWS Glue ETL ジョブは Python パッケージインストーラ (pip3) を使用して追加のモジュールをインストールします。
--additional-python-modules パラメータを使用して、C ベースの言語で記述された Python ライブラリをインストールすることもできます。
解決策
Python モジュールのインストールまたは更新
AWS Glue ジョブに追加の Python モジュールをインストールするには、次の手順を実行します。
- AWS Glue コンソールを開きます。
- ナビゲーションペインで [ジョブ] をクリックします。
- Python モジュールを追加するジョブを選択します。
- [アクション] を選択してから [ジョブの編集] を選択します。
- [セキュリティ設定、スクリプトライブラリ、およびジョブパラメータ (オプション)] セクションを展開します。
- [ジョブパラメータ] で、次の操作を行います。
[キー] に --additional-python-modules と入力します。
[値] に、追加するモジュールのコンマ区切りリストを入力します。 - [保存] をクリックします。
例えば、PyMySQL のバージョン 1.0.2 と Natural Language Toolkit (NLTK) のバージョン 3.6.2 という、2 つの新しいモジュールを追加するとします。PyMySQL モジュールはインターネットからインストールし、NLTK モジュールは Amazon Simple Storage Service (Amazon S3) バケットからインストールします。その場合、パラメータキー --additional-python-modules の値は pymysql==1.0.2, s3://aws-glue-add-modules/nltk-3.6.2-py3-none-any.whl になります。
一部のモジュールには、他のモジュールへの依存関係があります。このようなモジュールをインストールまたは更新する場合、そのモジュールが依存する他のモジュールもダウンロードする必要があります。したがって、モジュールをインストールまたは更新するには、インターネットにアクセスできる必要があります。インターネットにアクセスできない場合は、「Building Python modules from a wheel for Spark ETL workloads using AWS Glue 2.0」(AWS Glue 2.0 を使用して Spark ETL ワークロード用のホイールから Python モジュールを構築する) を参照してください。
AWS Glue の各バージョンにデフォルトで含まれている Python モジュールのリストについては、「AWS Glue で提供済みの Python モジュール」を参照してください。
C ベースの Python モジュールをインストールする
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI のエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
AWS Glue は、--additional-python-modules パラメータのある、C で記述されたライブラリと拡張機能もサポートしています。ただし、spacy や grpc などの一部の Python モジュールのインストールには root アクセス許可が必要です。AWS Glue は、パッケージのインストール中にルートアクセス許可を提供しません。バイナリを AWS Glue と互換性のあるホイールに事前コンパイルし、そのホイールをインストールすると、この問題を解決できます。
ライブラリを C ベースの言語でコンパイルするには、コンパイラがターゲットのオペレーティングシステムおよびプロセッサアーキテクチャと互換性がある必要があります。ライブラリが別のオペレーティングシステムまたはプロセッサアーキテクチャでコンパイルされている場合、ホイールは AWS Glue にインストールされません。AWS Glue はマネージドサービスであるため、クラスターにアクセスしてこれらの依存関係を作成することはできません。
ルートアクセス許可を必要とする C ベースの Python モジュールを事前コンパイルするには、次の手順を実行します。
-
ライブラリ用に十分なボリュームスペースがある Amazon Elastic Compute Cloud (Amazon EC2) Linux インスタンス (Amazon Linux 2 AMI) を起動します。
-
EC2 インスタンスに Docker をインストールし、sudo 以外のアクセスを設定して Docker を起動します。上記を行うには、以下のコマンドを実行します。
Docker をインストールします。
sudo yum install docker -ysudo アクセスを設定します。
sudo suDocker を起動します。
sudo service docker start -
モジュール用の Dockerfile ファイルを作成します。例えば、grpcio モジュールをインストールするには、dockerfile_grpcio というファイルを作成し、次の内容をそのファイルにコピーします。
FROM amazonlinux:2 # Install required repositories and tools RUN yum update -y RUN yum install shadow-utils.x86_64 -y # Install Java 8 (corrected package name) RUN yum install -y java-1.8.0-openjdk.x86_64 # Install Python 3.7 WORKDIR /opt RUN yum install -y gcc openssl-devel bzip2-devel libffi-devel wget tar make # Install Python 3.7 RUN wget https://www.python.org/ftp/python/3.7.12/Python-3.7.12.tgz RUN tar xzf Python-3.7.12.tgz WORKDIR /opt/Python-3.7.12 RUN ./configure --enable-optimizations RUN make altinstall RUN ln -sf /usr/local/bin/python3.7 /usr/bin/python3 RUN ln -sf /usr/local/bin/pip3.7 /usr/bin/pip3 # Verify Python version RUN python3 --version RUN pip3 --version # Install other dependencies RUN yum install -y doxygen autoconf automake libtool zlib-devel openssl-devel maven wget protobuf-compiler cmake make gcc-c++ RUN yum install -y python3-devel # Install Python packages RUN pip3 install --upgrade pip RUN pip3 install wheel RUN pip3 install cython numpy scipy RUN pip3 install cmake scikit-build # Create wheel directory and install grpcio WORKDIR /root RUN mkdir wheel_dir RUN pip3 install Cython RUN pip3 install grpcio RUN pip3 wheel grpcio -w wheel_dir -
docker build を実行して Dockerfile をビルドします。
docker build -f dockerfile_grpcio . -
Docker デーモンを再起動します。
sudo service docker restartdocker build コマンドが完了すると、Docker イメージ ID を含む成功メッセージが表示されます。例えば、"Successfully built 1111222233334444" などです。次のステップで使用するために Docker イメージ ID を書き留めておきます。
-
Docker コンテナからホイールファイル (.whl) を抽出します。上記を行うには、以下のコマンドを実行します。
Docker イメージ ID を取得します。
docker image lsコンテナを実行します。1111222233334444 は、実際の Docker イメージ ID に置き換えます。
docker run -dit 111122223334444ホイールファイルの場所を確認し、ホイールファイル名を取得します。5555666677778888 は、実際のコンテナ ID に置き換えます。
docker exec -t -i 5555666677778888 ls /root/wheel_dir/ホイールを Docker コンテナから Amazon EC2 にコピーします。
docker cp 5555666677778888:/root/wheel_dir/doc-example-wheel .注: doc-example-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/注: grpcio-1.32.0-cp37-cp37m-linux_x86_64.whl は、お使いの Python パッケージファイル名に置き換えます。
-
AWS Glue コンソールを開きます。
-
AWS Glue ETL ジョブの [ジョブパラメータ] に、以下を入力します。
[キー] に --additional-python-modules と入力します。
[値] に s3://aws-glue-add-modules/grpcio/grpcio-1.32.0-cp37-cp37m-linux_x86_64.whl と入力します。

