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
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 ファイルを作成するには
-
Virtual Private Cloud (VPC) で Amazon Redshift クラスターを作成し、テーブルにデータを追加します。
-
クラスターを作成した VPC と SecurityGroup とサブネットを組み合わせて AWS Glue 接続を作成します。接続に成功するかどうかをテストします。
-
redshift_example
という名前のディレクトリを作成して、setup.py
という名前のファイルを作成します。次のコードをsetup.py
に貼り付けます。from setuptools import setup setup( name="redshift_module", version="0.1", packages=['redshift_module'] )
-
redshift_example
ディレクトリにredshift_module
ディレクトリを作成します。redshift_module
ディレクトリに、ファイル__init__.py
とpygresql_redshift_common.py
を作成します。 -
__init__.py
ファイルは空のままにします。pygresql_redshift_common.py
内に次のコードを貼り付けます。port
、db_name
、user
、および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 * fromtable_name
;" res = con.query(statement) return res -
redshift_example
ディレクトリに変更します (現在のディレクトリではない場合)。 -
次のいずれかを行います。
.egg
ファイルを作成するには、次のコマンドを実行します。python setup.py bdist_egg
.whl
ファイルを作成するには、次のコマンドを実行します。python setup.py bdist_wheel
-
前述のコマンドに必要な依存関係をインストールします。
-
このコマンドでは、
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
に配置します。 -
-
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 -
前述のファイルを Amazon S3 にアップロードします。この例では、アップロードするファイルパスは
s3://DOC-EXAMPLE-BUCKET/scriptname.py
に配置します。 -
このスクリプトを使用して、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
」を参照してください。