AWS Glue での Python シェルジョブに関するジョブプロパティの設定 - AWS Glue

AWS Glue での Python シェルジョブに関するジョブプロパティの設定

Python シェルジョブを使用して、AWS Glue でシェルとして Python スクリプトを実行できます。Python シェルジョブを使用すると、Python 3.6 または Python 3.9 と互換性のあるスクリプトを実行することができます。

制約事項

Python シェルジョブには、次の制限があることに注意してください。

  • Python シェルを使用してジョブのブックマークを使用することはできません。

  • Python 3.9 以降では、.egg ファイルとして Python ライブラリをパッケージ化することはできません。代わりに .whl を使用してください。

  • S3 データの一時的なコピーには制限があるため、--extra-files オプションは使用できません。

Python シェルジョブのジョブプロパティの定義

このセクションでは、AWS Glue Studio でのジョブプロパティの定義、または AWS CLI の使用について説明します。

AWS Glue Studio

AWS Glue Studio で Python シェルジョブを定義する場合、次のいくつかのプロパティを指定します。

IAM ロール

ジョブの実行とデータストアへのアクセスに使用されるリソースの認可に使用する AWS Identity and Access Management IAM ロールを指定します。AWS Glue でジョブを実行するためのアクセス権限の詳細については、AWS Glue のアイデンティティとアクセスの管理 を参照してください。

タイプ

[Python シェル] を選択して、pythonshell という名前のジョブコマンドを使用して Python スクリプトを実行します。

Python バージョン

Python のバージョンを選択します。デフォルトは Python 3.9 です。有効なバージョンは Python 3.6 および Python 3.9 です。

共通分析ライブラリを読み込む (推奨)

Python 3.9 用の共通ライブラリを Python シェルに含めるには、このオプションを選択します。

ライブラリがカスタムであったり、インストール済みのライブラリと競合する場合は、共通ライブラリをインストールしないことを選択することができます。しかしながら、共通ライブラリ以外のライブラリを追加でインストールすることは可能です。

このオプションを選択する場合、library-set オプションが analytics に設定されます。このオプションの選択を外す場合、library-set オプションが none に設定されます。

スクリプトのファイル名とスクリプトパス

スクリプトのコードでジョブの手続きロジックを定義します。Amazon Simple Storage Service (Amazon S3) でスクリプト名と場所を指定します。パスのスクリプトディレクトリと同じ名前のファイルが存在していないことを確認します。スクリプトの使用の詳細については、「AWS Glue プログラミングガイド」を参照してください。

スクリプト

スクリプトのコードでジョブの手続きロジックを定義します。Python 3.6 または Python 3.9 でスクリプトをコーディングできます。スクリプトは AWS Glue Studio で編集できます。

データ処理単位

このジョブの実行に割り当てられる AWS Glue データ処理ユニット (DPU) の最大数。DPU は処理能力を相対的に測定するもので、4 個の vCPU のコンピューティング性能と 16 GB のメモリで構成されています。詳細については、「AWS Glue 料金」を参照してください。

値を 0.0625 または 1 に設定できます。デフォルトは 0.0625 です。いずれの場合も、インスタンスのローカルディスクは 20 GB になります。

CLI

また、以下の例のように、AWS CLI を使用して Python シェルジョブを作成することもできます

aws glue create-job --name python-job-cli --role Glue_DefaultRole --command '{"Name" : "pythonshell", "PythonVersion": "3.9", "ScriptLocation" : "s3://DOC-EXAMPLE-BUCKET/scriptname.py"}' --max-capacity 0.0625
注記

--glue-version パラメータは AWS Glue シェルジョブに適用されないため、AWS Glue のバージョンを指定する必要はありません。指定されたバージョンは無視されます。

AWS CLI で作成したジョブはデフォルトで Python 3 になります。有効な Python バージョンは 3 (3.6 に対応) と 3.9 です。Python 3.6 を指定するには、--command パラメータにこのタプルを追加します: "PythonVersion":"3"

Python 3.9 を指定するには、--command パラメータにこのタプルを追加します: "PythonVersion":"3.9"

Python シェルジョブによって使用される最大容量を設定するには、--max-capacity パラメータを指定します。Python シェルジョブに --allocated-capacity パラメータは使用できません。

サポートされている Python シェルジョブのライブラリ

Python 3.9 を使用する Python シェルでは、必要に応じて事前にパッケージ済みのライブラリセットを使用するようにライブラリセットを選択できます。ライブラリセットを選択するには、library-set オプションを使用します。有効な値は、analytics および none です。

Python シェルジョブを実行する環境は、次のライブラリをサポートしています。

Python バージョン Python 3.6 Python 3.9
ライブラリセット 該当なし 分析 なし
avro 1.11.0
awscli 116.242 1.23.5 1.23.5
awswrangler 2.15.1
botocore 1.12.232 1.24.21 1.23.5
boto3 1.9.203 1.21.21
Elasticsearch 8.2.0
numpy 1.16.2 1.22.3
pandas 0.24.2 1.4.2
psycopg2 2.9.3
pyathena 2.5.3
PyGreSQL 5.0.6
PyMySQL 1.0.2
pyodbc 4.0.32
pyorc 0.6.0
redshift-connector 2.0.907
リクエスト 2.22.0 2.27.1
scikit-learn 0.20.3 1.0.2
scipy 1.2.1 1.8.0
SQLAlchemy 1.4.36
s3fs 2022.3.0

科学計算用の Python シェルジョブで、NumPy ライブラリを使用できます。詳細については、「NumPy」を参照してください。以下の例は、Python シェルジョブで使用できる NumPy スクリプトを示しています。このスクリプトは、「Hello world」といくつかの数値計算の結果を出力します。

import numpy as np print("Hello world") a = np.array([20,30,40,50]) print(a) b = np.arange( 4 ) print(b) c = a-b print(c) d = b**2 print(d)

独自の Python ライブラリの提供

PIP を使用する

Python 3.9 を使用する Python シェルでは、ジョブレベルで追加の Python モジュールや異なるバージョンを指定することもできます。--additional-python-modules オプションでコンマ区切りの Python モジュールのリストを指定することで、新しいモジュールを追加したり、既存のモジュールのバージョンを変更したりできます。Python シェルジョブを使用する場合、Amazon S3 でホストされているカスタム Python モジュールにこのパラメータを指定することはできません。

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

AWS Glue は Python パッケージインストーラ (pip3) を使用して追加のモジュールをインストールします。--additional-python-modules 値の中で、追加の pip3 オプションを渡すことができます。例えば、 "scikit-learn==0.21.3 -i https://pypi.python.org/simple/" と指定します。pip3 からの非互換性や制限は、すべて適用されます。

注記

将来的に互換性が失われないように、Python3.9用にビルドされたライブラリを使用することをお勧めします。

Egg または Whl ファイルを使用する

1 つ以上の Python ライブラリが .egg または .whl ファイルとして既にパッケージ化されている場合があります。その場合は、次の例のように、「--extra-py-files」フラグの下で AWS Command Line Interface (AWS CLI) を使用して、それらをジョブに指定できます。

aws glue create-job --name python-redshift-test-cli --role role --command '{"Name" : "pythonshell", "ScriptLocation" : "s3://MyBucket/python/library/redshift_test.py"}' --connections Connections=connection-name --default-arguments '{"--extra-py-files" : ["s3://DOC-EXAMPLE-BUCKET/EGG-FILE", "s3://DOC-EXAMPLE-BUCKET/WHEEL-FILE"]}'

Python ライブラリから .egg ファイルまたは .whl ファイルを作成する方法がわからない場合は、次のステップを使用してください。この例は、macOS、Linux、および Windows Subsystem for Linux (WSL) で適用できます。

Python の .egg ファイルまたは .whl ファイルを作成するには
  1. Virtual Private Cloud (VPC) で Amazon Redshift クラスターを作成し、テーブルにデータを追加します。

  2. クラスターを作成した VPC と SecurityGroup とサブネットを組み合わせて AWS Glue 接続を作成します。接続に成功するかどうかをテストします。

  3. redshift_example という名前のディレクトリを作成して、setup.py という名前のファイルを作成します。次のコードを setup.py に貼り付けます。

    from setuptools import setup setup( name="redshift_module", version="0.1", packages=['redshift_module'] )
  4. redshift_example ディレクトリに redshift_module ディレクトリを作成します。redshift_module ディレクトリに、ファイル __init__.pypygresql_redshift_common.py を作成します。

  5. __init__.py ファイルは空のままにします。pygresql_redshift_common.py 内に次のコードを貼り付けます。portdb_nameuser、および password_for_user を、Amazon Redshift クラスター固有の詳細に置き換えます。table_name を Amazon Redshift のテーブルの名前と置き換えます。

    import pg def get_connection(host): rs_conn_string = "host=%s port=%s dbname=%s user=%s password=%s" % ( host, port, db_name, user, password_for_user) rs_conn = pg.connect(dbname=rs_conn_string) rs_conn.query("set statement_timeout = 1200000") return rs_conn def query(con): statement = "Select * from table_name;" res = con.query(statement) return res
  6. redshift_example ディレクトリに変更します (現在のディレクトリではない場合)。

  7. 次のいずれかを行います。

    • .egg ファイルを作成するには、次のコマンドを実行します。

      python setup.py bdist_egg
    • .whl ファイルを作成するには、次のコマンドを実行します。

      python setup.py bdist_wheel
  8. 前述のコマンドに必要な依存関係をインストールします。

  9. このコマンドでは、dist ディレクトリにファイルを作成します。

    • egg ファイルを作成した場合は、redshift_module-0.1-py2.7.egg という名前になります。

    • wheel ファイルを作成した場合は、redshift_module-0.1-py2.7-none-any.whl という名前になります。

    このファイルを Amazon S3 にアップロードします。

    この例では、アップロードするファイルパスは s3://DOC-EXAMPLE-BUCKET/EGG-FILE または s3://DOC-EXAMPLE-BUCKET/WHEEL-FILE に配置します。

  10. AWS Glue ジョブのスクリプトとして使用する Python ファイルを作成し、このファイルに次のコードを追加します。

    from redshift_module import pygresql_redshift_common as rs_common con1 = rs_common.get_connection(redshift_endpoint) res = rs_common.query(con1) print "Rows in the table cities are: " print res
  11. 前述のファイルを Amazon S3 にアップロードします。この例では、アップロードするファイルパスは s3://DOC-EXAMPLE-BUCKET/scriptname.py に配置します。

  12. このスクリプトを使用して、Python シェルジョブを作成します。AWS Glue コンソールの [Job properties] (ジョブプロパティ) ページの [Python library path] (Python ライブラリパス) ボックスで .egg/.whl ファイルへのパスを指定します。複数の .egg/.whl ファイルおよび Python ファイルがある場合は、このボックスにカンマ区切りリストとして指定します。

    .egg ファイルを変更または名前変更する場合、ファイル名は「python setup.py bdist_egg」コマンドによって生成されたデフォルト名を使用するか、Python モジュールの命名規則に従う必要があります。詳細については、「Style Guide for Python Code」を参照してください。

    次の例のように、AWS CLI でコマンドを使用してジョブを作成します。

    aws glue create-job --name python-redshift-test-cli --role Role --command '{"Name" : "pythonshell", "ScriptLocation" : "s3://DOC-EXAMPLE-BUCKET/scriptname.py"}' --connections Connections="connection-name" --default-arguments '{"--extra-py-files" : ["s3://DOC-EXAMPLE-BUCKET/EGG-FILE", "s3://DOC-EXAMPLE-BUCKET/WHEEL-FILE"]}'

    ジョブが実行されると、スクリプトは、Amazon Redshift クラスターの [table_name] テーブルに作成された行をプリントします。

AWS Glue の Python シェルジョブで AWS CloudFormation を使用する

AWS Glue の Python シェルジョブで AWS CloudFormation を使用できます。以下に例を示します。

AWSTemplateFormatVersion: 2010-09-09 Resources: Python39Job: Type: 'AWS::Glue::Job' Properties: Command: Name: pythonshell PythonVersion: '3.9' ScriptLocation: 's3://bucket/location' MaxRetries: 0 Name: python-39-job Role: RoleName

Python シェルジョブ用の Amazon CloudWatch Logs グループは、/aws-glue/python-jobs/output です。エラーについては、「ロググループ /aws-glue/python-jobs/error」を参照してください。