AWS Glueでの Python シェルジョブ
Python シェルジョブを使用して、AWS Glue でシェルとして Python スクリプトを実行できます。Python シェルジョブを使用すると、Python 2.7 または Python 3.6 と互換性のあるスクリプトを実行することができます。
Python シェルを使用してジョブのブックマークを使用することはできません。Apache Spark ジョブで利用可能な他の機能のほとんどは Python シェルジョブでも利用可能です。
Python シェルジョブ用の Amazon CloudWatch Logs グループは、/aws-glue/python-jobs/output
です。エラーについては、ロググループ /aws-glue/python-jobs/errors
を参照してください。
Python シェルジョブのジョブプロパティの定義
コンソールで Python シェルジョブを定義する場合 (「AWS Glue コンソールでのジョブの使用」を参照してください)、次のいくつかのプロパティを指定します。
- [IAM role] (IAM ロール)
-
ジョブの実行とデータストアへのアクセスに使用されるリソースの認証に使用する AWS Identity and Access Management (IAM) ロールを指定します。AWS Glue でジョブを実行するためのアクセス権限の詳細については、AWS Glue リソースのアクセス許可の管理 を参照してください。
- タイプ
-
[Python シェル] を選択して、
pythonshell
という名前のジョブコマンドを使用して Python スクリプトを実行します。 - Python バージョン
-
Python のバージョンを選択します。デフォルトは Python 3 です。
- カスタムスクリプト
-
スクリプトのコードでジョブの手続きロジックを定義します。Amazon Simple Storage Service (Amazon S3) でスクリプト名と場所を指定します。パスのスクリプトディレクトリと同じ名前のファイルが存在していないことを確認します。スクリプトの使用の詳細については、AWS Glueコンソールで Spark スクリプトの編集 を参照してください。
- 既存または新しいスクリプト
-
スクリプトのコードでジョブの手続きロジックを定義します。Python 2.7 または Python 3.6 でスクリプトをコーディングできます。スクリプトは AWS Glue コンソールで編集できますが、AWS Glue では生成されません。
- 最大キャパシティー
-
このジョブの実行に割り当てられる AWS Glue データ処理ユニット (DPU) の最大数。DPU は処理能力を相対的に測定するもので、4 個の vCPU のコンピューティング性能と 16 GB のメモリで構成されています。詳細については、「AWS Glue 料金表
」を参照してください。 値を 0.0625 または 1 に設定できます。デフォルトは 0.0625 です。
追加のプロパティの説明については、「Spark ジョブのジョブプロパティの定義」を参照してください。AWS Glue コンソールを使用してジョブを追加する方法の詳細については、AWS Glue コンソールでのジョブの使用 を参照してください。
また、以下の例のように、AWS CLI を使用して Python シェルジョブを作成することもできます
aws glue create-job --name python-job-cli --role Glue_DefaultRole --command '{"Name" : "pythonshell", "ScriptLocation" : "s3://aws-glue-scripts-123456789012-us-east-1/Admin/python-job-cli.py"}'
AWS CLI で作成したジョブはデフォルトで Python 2 になります。Python 3 を指定するには、--command
パラメータにこのタプルを追加します。
"PythonVersion":"3"
Python シェルジョブによって使用される最大容量を設定するには、--max-capacity
パラメータを指定します。Python シェルジョブに --allocated-capacity
パラメータは使用できません。
サポートされている Python シェルジョブのライブラリ
Python シェルジョブを実行する環境は、次のライブラリをサポートしています。
Boto3
collections
CSV
gzip
multiprocessing
NumPy
pandas (python setuptools 設定である
setup.py
を使用してインストールする必要があります)pickle
-
PyGreSQL
re
SciPy
sklearn
sklearn.feature_extraction
sklearn.preprocessing
xml.etree.ElementTree
zipfile
科学計算用の 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 ライブラリのパッケージ化には、以下の制限があります。
Python 3.7 を使用した Windows 10 Pro での
.egg
ファイルの作成はサポートされていません。Python 3.6 を使用した WSL (Windows 10 Pro によってホストされる Windows Linux Subsystem) での
.egg
ファイルの作成はサポートされています。
独自の Python ライブラリの提供
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://MyBucket/python/library/redshift_module-0.1-py2.7.egg", "s3://MyBucket/python/library/redshift_module-0.1-py2.7-none-any.whl"]}'
Python ライブラリから .egg
ファイルまたは .whl
ファイルを作成する方法がわからない場合は、次のステップを使用してください。この例は、macOS、Linux、および Windows Subsystem for Linux (WSL) で適用できます。
Python の .egg ファイルまたは .whl ファイルを作成するには
-
Virtual Private Cloud (VPC) で Amazon Redshift クラスターを作成し、テーブルにデータを追加します。
-
クラスターを作成した VPC-SecurityGroup-Subnet の組み合わせの 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://MyBucket/python/library/redshift_module-0.1-py2.7.egg
またはs3://MyBucket/python/library/redshift_module-0.1-py2.7-none-any.whl
です。 -
-
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://MyBucket/python/library/redshift_test.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://MyBucket/python/library/redshift_test.py"}' --connections Connections="connection-name" --default-arguments '{"--extra-py-files" : ["s3://MyBucket/python/library/redshift_module-0.1-py2.7.egg", "s3://MyBucket/python/library/redshift_module-0.1-py2.7-none-any.whl"]}'
ジョブが実行されると、スクリプトは、Amazon Redshift クラスターの [
table_name
] テーブルに作成された行をプリントします。