スキップしてコンテンツを表示

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. [ジョブパラメータ] で、次の操作を行います。
    [キー] に --additional-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 になります。

一部のモジュールには、他のモジュールへの依存関係があります。このようなモジュールをインストールまたは更新する場合、そのモジュールが依存する他のモジュールもダウンロードする必要があります。したがって、モジュールをインストールまたは更新するには、インターネットにアクセスできる必要があります。インターネットにアクセスできない場合は、「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 モジュールを事前コンパイルするには、次の手順を実行します。

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

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

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

    sudo yum install docker -y

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

    sudo su

    Docker を起動します。

    sudo service docker start
  3. モジュール用の 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
  4. docker build を実行して Dockerfile をビルドします。

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

    sudo service docker restart

    docker build コマンドが完了すると、Docker イメージ ID を含む成功メッセージが表示されます。例えば、"Successfully built 1111222233334444" などです。次のステップで使用するために Docker イメージ ID を書き留めておきます。

  6. 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 は、生成されたホイールファイル名に置き換えます。

  7. ホイールを 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 ジョブの [ジョブパラメータ] に、以下を入力します。
    [キー] に --additional-python-modules と入力します。
    [値] に s3://aws-glue-add-modules/grpcio/grpcio-1.32.0-cp37-cp37m-linux_x86_64.whl と入力します。

関連情報

AWS Glue での Python ライブラリの使用

AWS公式更新しました 2年前