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 モジュールを追加するジョブを選択します。
- [アクション] を選択してから [ジョブの編集] を選択します。
- 「セキュリティ設定、スクリプトライブラリ、およびジョブパラメータ (オプション)」セクションを展開します。
- [ジョブパラメータ] で、以下を行います。
[キー] に「--addtional-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 になります。
一部のモジュールには、他のモジュールへの依存関係があります。このようなモジュールをインストールまたは更新する場合、そのモジュールが依存する他のモジュールもダウンロードする必要があります。したがって、モジュールをインストールまたは更新するには、インターネットにアクセスできる必要があります。インターネットにアクセスできない場合は、「AWS Glue 2.0 を使用して Spark ETL ワークロード用の wheel から 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 は、パッケージのインストール中に root アクセス許可を提供しません。バイナリを AWS Glue と互換性のある wheel に事前コンパイルし、その wheel をインストールすると、この問題を解決できます。
ライブラリを C ベースの言語でコンパイルするには、コンパイラがターゲットのオペレーティングシステムおよびプロセッサアーキテクチャと互換性がある必要があります。ライブラリが別のオペレーティングシステムまたはプロセッサアーキテクチャでコンパイルされている場合、wheel は AWS Glue にインストールされません。AWS Glue はマネージドサービスであるため、クラスターにアクセスしてこれらの依存関係を作成することはできません。
root 権限を必要とする 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 コンテナから wheel ファイル (.whl) を抽出します。上記を行うには、以下のコマンドを実行します。
Docker イメージ ID を取得します。
docker image lsコンテナを実行します。1111222233334444 は、実際の Docker イメージ ID に置き換えます。
docker run -dit 111122223334444wheel ファイルの場所を確認し、wheel ファイル名を取得します。5555666677778888 は、実際のコンテナ ID に置き換えます。
docker exec -t -i 5555666677778888 ls /root/wheel\_dir/wheel を Docker コンテナから Amazon EC2 にコピーします。
docker cp 5555666677778888:/root/wheel\_dir/doc-example-wheel .注: doc-example-wheel は、生成された wheel ファイル名に置き換えます。
-
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 ジョブの [ジョブパラメータ] に、以下を入力します。
[キー] に「--addtional-python-modules」と入力します。
[値] に s3://aws-glue-add-modules/grpcio/grpcio-1.32.0-cp37-cp37m-linux_x86_64.whl と入力します。

