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

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

AWS GlueAWS Glue ETL で使用するためのPythonモジュールやライブラリを追加でインストールすることができます。

AWS Glue 2.0 の pip を使用した追加 Python モジュールのインストール

AWS Glue では、Python Package Installer (pip3) を使用して、AWS Glue ETL で使用するモジュールを追加でインストールします。--additional-python-modules パラメータでコンマ区切りの Python モジュールのリストを指定することで、新しいモジュールを追加したり、既存のモジュールのバージョンを変更したりできます。Amazon S3 にディストリビューションをアップロードすることでライブラリのカスタムディストリビューションをインストールできます。その後で、モジュールのリストに Amazon S3 オブジェクトへのパスを含めます。

--python-modules-installer-option パラメータを使用すると、pip3 に追加オプションを渡すことができます。例えば "--upgrade" を渡すことで、"--additional-python-modules" で指定されたパッケージをアップグレードできます。その他の例については、「Building Python modules from a wheel for Spark ETL workloads using AWS Glue 2.0」(AWS Glue 2.0 を使用して Spark ETL ワークロード用のホイールから Python モジュールを構築する) を参照してください。

Python の依存関係が、ネイティブのコンパイル済みコードに過渡的に依存している場合、AWS Glue がジョブ環境でのネイティブコードのコンパイルをサポートしていない、という制限による影響を受ける場合があります。ただし、AWS Glue のジョブは、Amazon Linux 2 環境内での実行が可能です。ディストリビューション版 Wheel を通じて、ネイティブの依存関係をコンパイルされた形式で提供できる場合があります。

例えば、更新したり新しい scikit-learn モジュールを追加したりするには、"--additional-python-modules", "scikit-learn==0.21.3" のキー/値を使用します。

また、--additional-python-modules オプションの中で、Python ホイールモジュールへの Amazon S3 パスを指定できます。例:

--additional-python-modules s3://aws-glue-native-spark/tests/j4.2/ephem-3.7.7.1-cp37-cp37m-linux_x86_64.whl,s3://aws-glue-native-spark/tests/j4.2/fbprophet-0.6-py3-none-any.whl,scikit-learn==0.21.3

AWS Glue コンソールの [Job parameters] (ジョブパラメータ) フィールドを使用するか、AWS SDK によりジョブの引数を変更することで、--additional-python-modules を指定します。ジョブパラメータの設定については、「AWS Glue によって使用されるジョブパラメータ」を参照してください。

PySpark のネイティブ機能を使用して Python ファイルを含める

AWS Glue では、PySpark を使用して、AWS Glue ETL ジョブに Python ファイルを含めます。可能な場合には、依存関係を管理するために、--additional-python-modules を使用することが必要になります。Python ファイルをインクルードするには、--extra-py-files ジョブパラメータを使用します。依存関係は Amazon S3 でホストされている必要があり、引数の値は、スペースを含まない Amazon S3 パスのカンマ区切りリストである必要があります。この機能は、Spark で使用する Python の依存関係管理のように動作します。Spark での Python の依存関係管理の詳細については、Apache Spark ドキュメントの「Using PySpark Native Features」(PySpark のネイティブ機能を使う) ページを参照してください。追加のコードがパッケージ化されていない場合や、依存関係を管理するために既存のツールチェーンを使用して Spark プログラムを移行する場合には、--extra-py-files が便利です。依存関係ツールをメンテナンス可能にするには、送信する前に依存関係をバンドルする必要があります。

AWS Glue で提供済みの Python モジュール

これらの提供済みモジュールのバージョンを変更するには、--additional-python-modules ジョブパラメータにより新しいバージョンを指定します。

AWS Glue version 2.0

AWS Glue バージョン 2.0 では、すぐに使用できる次の Python モジュールがサポートされています。

  • boto3==1.12.4

  • botocore==1.15.4

  • certifi==2019.11.28

  • chardet==3.0.4

  • cycler==0.10.0

  • Cython==0.29.15

  • docutils==0.15.2

  • enum34==1.1.9

  • fsspec==0.6.2

  • idna==2.9

  • jmespath==0.9.4

  • joblib==0.14.1

  • kiwisolver==1.1.0

  • matplotlib==3.1.3

  • mpmath==1.1.0

  • numpy==1.18.1

  • pandas==1.0.1

  • patsy==0.5.1

  • pmdarima==1.5.3

  • ptvsd==4.3.2

  • pyarrow==0.16.0

  • pydevd==1.9.0

  • pyhocon==0.3.54

  • PyMySQL==0.9.3

  • pyparsing==2.4.6

  • python_dateutil==2.8.1

  • pytz==2019.3

  • requests==2.23.0

  • s3fs==0.4.0

  • s3transfer==0.3.3

  • scikit-learn==0.22.1

  • scipy==1.4.1

  • setuptools==45.2.0

  • setuptools==45.2.0

  • six==1.14.0

  • statsmodels==0.11.1

  • subprocess32==3.5.4

  • sympy==1.5.1

  • tbats==1.0.9

  • urllib3==1.25.8

AWS Glue バージョン 3.0

AWS Glue バージョン 3.0 では、すぐに使用できる、以下の Python モジュールがサポートされています。

  • aiobotocore==1.4.2

  • aiohttp==3.8.1

  • aioitertools==0.10.0

  • aiosignal==1.2.0

  • async-timeout==4.0.2

  • asynctest==0.13.0

  • attrs==21.4.0

  • avro-python3==1.10.2

  • awsgluecustomconnectorpython==1.0

  • awsgluedataplanepython==1.0

  • awsgluemlentitydetectorwrapperpython==1.0

  • boto3==1.18.50

  • botocore==1.21.50

  • certifi==2021.5.30

  • chardet==3.0.4

  • charset-normalizer==2.1.0

  • click==8.1.3

  • cycler==0.10.0

  • cython==0.29.4

  • docutils==0.17.1

  • enum34==1.1.10

  • frozenlist==1.3.0

  • fsspec==2021.8.1

  • idna==2.10

  • importlib-metadata==4.12.0

  • jmespath==0.10.0

  • joblib==1.0.1

  • kiwisolver==1.3.2

  • matplotlib==3.4.3

  • mpmath==1.2.1

  • multidict==6.0.2

  • nltk==3.6.3

  • numpy==1.19.5

  • packaging==21.3

  • pandas==1.3.2

  • patsy==0.5.1

  • pillow==9.1.1

  • pip==22.1.2

  • pmdarima==1.8.2

  • ptvsd==4.3.2

  • pyarrow==5.0.0

  • pydevd==2.5.0

  • pyhocon==0.3.58

  • pymysql==1.0.2

  • pyparsing==2.4.7

  • python-dateutil==2.8.2

  • pytz==2021.1

  • pyyaml==5.4.1

  • regex==2022.6.2

  • requests==2.23.0

  • s3fs==2021.8.1

  • s3transfer==0.5.0

  • scikit-learn==0.24.2

  • scipy==1.7.1

  • setuptools==49.1.3

  • six==1.16.0

  • spark==1.0

  • statsmodels==0.12.2

  • subprocess32==3.5.4

  • sympy==1.8

  • tbats==1.1.0

  • threadpoolctl==3.1.0

  • tqdm==4.64.0

  • typing-extensions==4.2.0

  • urllib3==1.25.11

  • wheel==0.37.0

  • wrapt==1.14.1

  • yarl==1.7.2

  • zipp==3.8.0

取り込みのためのライブラリの圧縮

ライブラリは、単一の .py ファイルに含まれていない限り、.zip アーカイブにパッケージ化される必要があります。パッケージディレクトリは、アーカイブのルートにあって、パッケージの __init__.py ファイルを含んでいる必要があります。そうすると、Python は通常の方法でパッケージをインポートできるようになります。

ライブラリが 1 つの .py ファイルにある単一の Python モジュールでのみ構成されている場合、.zip ファイルに入れる必要はありません。

開発エンドポイントへの Python ライブラリのロード

異なる ETL スクリプトに異なるライブラリセットを使用している場合、各セットに別々の開発エンドポイントをセットアップするか、スクリプトを切り替えるたびに開発エンドポイントがロードするライブラリ .zip ファイルを上書きすることができます。

コンソールを使用して、作成時に開発エンドポイントに 1 つまたは複数のライブラリ .zip ファイルを指定できます。名前と IAM ロールを割り当てた後、[Script Libraries and job parameters (optional)] (スクリプトライブラリおよびジョブパラメータ (任意)) をクリックし、[Python library path] (Python ライブラリパス) ボックスに、ライブラリ .zip ファイルへの完全な Amazon S3 パスを入力します。例:

s3://bucket/prefix/site-packages.zip

必要に応じてファイルへの複数のフルパスを指定できますが、以下のように、スペースなしでカンマで区切ります。

s3://bucket/prefix/lib_A.zip,s3://bucket_B/prefix/lib_X.zip

これらの .zip ファイルを後で更新する場合は、コンソールを使用して開発エンドポイントにそのファイルを再インポートできます。該当する開発エンドポイントに移動し、横にあるチェックボックスをオンにして、[Action] (アクション) メニューから [Update ETL libraries] (ETL ライブラリの更新) を選択します。

同様の方法で、AWS Glue API を使用してライブラリファイルを指定できます。CreateDevEndpoint アクション (Python: create_dev_endpoint) を呼び出して開発エンドポイントを作成する場合、ExtraPythonLibsS3Path パラメータでライブラリへの 1 つ以上のフルパスを指定できます。以下のような呼び出しになります。

dep = glue.create_dev_endpoint( EndpointName="testDevEndpoint", RoleArn="arn:aws:iam::123456789012", SecurityGroupIds="sg-7f5ad1ff", SubnetId="subnet-c12fdba4", PublicKey="ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCtp04H/y...", NumberOfNodes=3, ExtraPythonLibsS3Path="s3://bucket/prefix/lib_A.zip,s3://bucket_B/prefix/lib_X.zip")

開発エンドポイントを更新するときに、DevEndpointCustomLibraries オブジェクトを使用し UpdateDevEndpoint (update_dev_endpoint) の呼び出し時に UpdateEtlLibraries パラメータを True に設定して、ロードするライブラリも更新できます。

開発エンドポイントで Zeppelin ノートブックを使用している場合、.zip ファイルから 1 つ以上のパッケージをインポートする前に、以下の PySpark 関数を呼び出す必要があります。

sc.addPyFile("/home/glue/downloads/python/yourZipFileName.zip")

ジョブまたは JobRun での Python ライブラリの使用

コンソールで新しいジョブを作成する際、[Script Libraries and job parameters (optional)] (スクリプトライブラリおよびジョブパラメータ (任意)) をクリックし、開発エンドポイント作成時と同じ方法で Amazon S3 ライブラリの完全なパスを入力することで、1 つ以上のライブラリ .zip ファイルを指定できます。

s3://bucket/prefix/lib_A.zip,s3://bucket_B/prefix/lib_X.zip

CreateJob (create_job) を呼び出している場合は、以下のようにデフォルトの --extra-py-files パラメータを使用してデフォルトのライブラリへの 1 つ以上のフルパスを指定できます。

job = glue.create_job(Name='sampleJob', Role='Glue_DefaultRole', Command={'Name': 'glueetl', 'ScriptLocation': 's3://my_script_bucket/scripts/my_etl_script.py'}, DefaultArguments={'--extra-py-files': 's3://bucket/prefix/lib_A.zip,s3://bucket_B/prefix/lib_X.zip'})

その後 JobRun を開始するときに、デフォルトのライブラリ設定を別のもので上書きできます。

runId = glue.start_job_run(JobName='sampleJob', Arguments={'--extra-py-files': 's3://bucket/prefix/lib_B.zip'})