設定 Python 殼層工作的工作屬性 AWS Glue - AWS Glue

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

設定 Python 殼層工作的工作屬性 AWS Glue

您可以使用 Python shell 任務,在 AWS Glue 中以 shell 的方式執行 Python 指令碼。使用 Python 殼層工作,您可以執行與 Python 3.6 或 3.9 相容的指令碼。

限制

注意 Python Shell 任務的下列限制:

  • 您無法使用任務書籤搭配 Python shell 任務。

  • 你不能打包任何 Python 庫作為.egg文件在 Python 3.9 +。請改用 .whl

  • 由於 S3 資料的暫時複本有限制,--extra-files 選項無法使用。

為 Python shell 任務定義任務屬性

這些章節描述了在中AWS Glue Studio定義或使用 AWS CLI 的工作屬性。

AWS Glue Studio

當您在 AWS Glue Studio 中定義 Python Shell 任務時,您會提供以下一些屬性:

IAM 角色

指定用於授權用於對用於執行任務和存取資料存放區的資源進行授權的 AWS Identity and Access Management (IAM) 角色。如需在 AWS Glue 執行任務之許可的詳細資訊,請參閱 AWS Glue 的身分和存取管理

Type

選擇 Python shell (Python shell) 來​使用名為 pythonshell 的任務執行 Python 指令碼。

Python 版本

選擇 Python 版本。預設為 Python 3.9。有效版本為 Python 3.6 和 Python 3.9。

載入常見的分析程式庫 (建議)

選擇此選項可在 Python Shell 中包含 Python 3.9 的常見程式庫。

如果您的程式庫是自訂的,或者與預先安裝的程式庫衝突,您可以選擇不安裝常見程式庫。但是,除了常見程式庫之外,您還可以安裝其他程式庫。

當您選取此選項時,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

您也可以使用建立 Python 殼層工作 AWS CLI,如下列範例所示。

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
注意

您不需要指定的版本,AWS Glue因為參數--glue-version不適用於 AWS Glue shell 作業。指定的任何版本都將被忽略。

您建立的工作 AWS CLI 預設值為 Python 3。有效的 Python 版本為 3 (對應於 3.6) 和 3.9。若要指定 Python 3.6,請將此元組新增至 --command 參數:"PythonVersion":"3"

若要指定 Python 3.9,請將此元組新增至 --command 參數:"PythonVersion":"3.9"

若要設定 Python shell 任務所用的容量上限,請提供 --max-capacity 參數。​ 無法將 --allocated-capacity 參數用於 Python shell 任務。

適用於 Python shell 任務的支援程式庫

在使用 Python 3.9 的 Python Shell 中,您可以選擇程式庫集來使用預先封裝的程式庫集來滿足您的需求。您可以使用 library-set 選項來選擇程式庫集。有效值為 analyticsnone

執行 Python shell 任務的環境支援以下程式庫:

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 shell 任務中使用 NumPy​ 程式庫以進行科學運算。如需詳細資訊,請參閱NumPy。下列範例顯示可在 NumPy Python 殼層作業中使用的指令碼。指令碼會列印「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 Shell 使用 Python 3.9 允許您在任務層級提供額外的 Python 模組或不同的版本。您可以使用 --additional-python-modules 選項與逗號分隔的 Python 模組清單來新增新模組或變更現有模組的版本。使用 Python Shell 任務時,您無法使用此參數來提供在 Amazon S3 上託管的自訂 Python 模組。

例如,要更新或新增新的 scikit-learn 模組,請使用以下索引鍵與值:"--additional-python-modules", "scikit-learn==0.21.3"

AWS Glue 使用 Python Package Installer (pip3) 來安裝其他模組。您可以在 --additional-python-modules 值內傳遞額外的 pip3 選項。例如 "scikit-learn==0.21.3 -i https://pypi.python.org/simple/"。來自 pip3 的任何不相容或限制都適用。

注意

為避免未來出現不相容,我們建議您使用為 Python 3.9 建置的程式庫。

使用 Egg 或 Whl 文件

您可能已有一或多個 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 和適用於 Linux 的 Windows 子系統 (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-FILEs3://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 shell 任務。在 AWS Glue 主控台的 Job properties (任務屬性) 頁面上,在 Python library path (Python 程式庫路徑) 方塊中指定 .egg/.whl 檔案的路徑。如果您有多個 .egg/.whl 檔案和​ Python 檔案,請在此方塊中提供以逗號分隔的清單。

    修改或重新命名 .egg 檔案時,檔案名稱必須使用由「python setup.py bdist_egg」指令產生的預設名稱,或必須承繼 Python 模組命名慣例。如需詳細資訊,請參閱 Python 程式碼樣式指南

    使用 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 CloudFormation 與 Python 殼層工作搭配使用 AWS Glue

您可以在中使 AWS CloudFormation 用 Python 殼層作業AWS Glue。以下是範例:

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

Amazon CloudWatch 日誌組 Python 外殼任務輸出是/aws-glue/python-jobs/output. 針對錯誤,請參閱日誌群組 /aws-glue/python-jobs/error。​