AWS Glue の ETL ジョブで外部 Python ライブラリを使用する方法を教えてください。

所要時間3分
0

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 モジュールをインストールするには、次の手順を実行します。

  1. AWS Glue コンソールを開きます。
  2. ナビゲーションペインで [ジョブ] を選択します。
  3. Python モジュールを追加するジョブを選択します。
  4. [アクション] を選択してから [ジョブの編集] を選択します。
  5. セキュリティ設定、スクリプトライブラリ、およびジョブパラメータ (オプション)」セクションを展開します。
  6. [ジョブパラメータ] で、以下を行います。
    [キー] に「--addtional-python-modules」と入力します。
    [値] に、追加するモジュールのコンマ区切りリストを入力します。
  7. [保存] を選択します。

たとえば、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 で記述されたライブラリと拡張機能もサポートしています。ただし、spacygrpc などの一部の Python モジュールのインストールには root 権限が必要です。AWS Glue は、パッケージのインストール中に root アクセス許可を提供しません。バイナリを AWS Glue と互換性のある wheel に事前コンパイルし、その wheel をインストールすると、この問題を解決できます。

ライブラリを C ベースの言語でコンパイルするには、コンパイラがターゲットのオペレーティングシステムおよびプロセッサアーキテクチャと互換性がある必要があります。ライブラリが別のオペレーティングシステムまたはプロセッサアーキテクチャでコンパイルされている場合、wheel は AWS Glue にインストールされません。AWS Glue はマネージドサービスであるため、クラスターにアクセスしてこれらの依存関係を作成することはできません。

root 権限を必要とする C ベースの Python モジュールを事前コンパイルするには、次の手順を実行します。

  1. ライブラリ用に十分なボリュームスペースがある Amazon Elastic Compute Cloud (Amazon EC2) Linux インスタンスを起動します。

  2. EC2 インスタンスに Docker をインストールし、sudo 以外のアクセスを設定して、Docker を起動します。上記を行うには、以下のコマンドを実行します。

    Docker をインストールします。

    sudo yum install docker -y

    sudo 以外のアクセスを設定します。

    sudo usermod -a -G docker ec2-user

    Docker を起動します。

    sudo service docker start
  3. モジュール用の Dockerfile ファイルを作成します。たとえば、grpcio モジュールをインストールするには、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 build を実行して Dockerfile をビルドします。

    docker build -f dockerfile\_grpcio .
  5. Docker デーモンを再起動します。

    sudo service docker restart

    docker build コマンドが完了すると、Docker イメージ ID を含む成功メッセージが表示されます。(「1111222233334444が正常にビルドされました」など。)次のステップで使用するために Docker イメージ ID を書き留めておきます。

  6. Docker コンテナから wheel ファイル (.whl) を抽出します。上記を行うには、以下のコマンドを実行します。

    Docker イメージ ID を取得します。

    docker image ls

    コンテナを実行します。1111222233334444 は、実際の Docker イメージ ID に置き換えます。

    docker run -dit 111122223334444

    wheel ファイルの場所を確認し、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 ファイル名に置き換えます。

  7. 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 パッケージファイル名に置き換えます。

  8. AWS Glue コンソールを開きます。

  9. AWS Glue ETL ジョブの [ジョブパラメータ] に、以下を入力します。
    [キー] に「--addtional-python-modules」と入力します。
    [値]s3://aws-glue-add-modules/grpcio/grpcio-1.32.0-cp37-cp37m-linux_x86_64.whl と入力します。

関連情報

AWS Glue で Python ライブラリを使用する

AWS公式
AWS公式更新しました 5ヶ月前