Amazon Glue 中的 Python shell 作业 - Amazon Glue
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

Amazon Glue 中的 Python shell 作业

可以使用 Python shell 作业将 Python 脚本作为 Amazon Glue 中的 shell 运行。利用 Python shell 任务,您可以运行与 Python 2.7、Python 3.6 或 Python 3.9 兼容的脚本。

您不能将作业书签用于 Python shell 作业。

用于 Amazon CloudWatch Logs 组的 Python shell 任务输出为 /aws-glue/python-jobs/output。有关错误,请参阅日志组 /aws-glue/python-jobs/errors

定义 Python shell 作业的作业属性

以下各节介绍如何在 Amazon Glue Studio 中或使用 Amazon CLI 定义任务属性。

Amazon Glue Studio

当您在 Amazon Glue Studio 中定义 Python shell 任务时,请提供以下一些属性:

IAM 角色

指定用于对运行任务和访问数据存储所用的资源进行授权的 Amazon Identity and Access Management(IAM)角色。有关在 Amazon Glue 中运行作业的权限的更多信息,请参阅 管理 Amazon Glue 资源的访问权限

类型

选择 Python shell 命令以使用名为 pythonshell 的作业运行 Python 脚本。

Python 版本

选择 Python 版本。默认为 Python 3.6。有效版本为 Python 3.6 和 Python 3.9。

加载常用分析库(推荐)

选择此选项可在 Python shell 中包含适用于 Python 3.9 的常用库。

如果您的库是自定义的或者与预安装的库冲突,则可以选择不安装常用库。但是,除了常用库之外,您还可以安装其他库。

如果您选择此选项,则 library-set 选项设置为 analytics。如果您取消选择此选项,则 library-set 选项设置为 none

脚本文件名和脚本路径

脚本中的代码定义了作业的过程逻辑。您需要在 Amazon Simple Storage Service(Amazon S3)中提供脚本名称和位置。确认没有与路径中的脚本目录同名的文件。要了解有关使用脚本的更多信息,请参阅在 Amazon Glue 控制台中编辑 Spark 脚本

Script

脚本中的代码定义了作业的过程逻辑。您可以在 Python 3.6 或 Python 3.9 中编写脚本代码。您可以在 Amazon Glue Studio 中编辑脚本。

数据处理单元

此作业运行时可分配的 Amazon Glue 数据处理单元 (DPU) 的最大数量。DPU 是对处理能力的相对度量,它由 4 个 vCPU 的计算容量和 16GB 内存组成。有关更多信息,请参阅 Amazon Glue 定价

您可以将该值设置为 0.0625 或 1。默认值为 0.0625。

CLI

您还可以使用 Amazon CLI 创建 Python Shell 任务,如以下示例所示。

aws glue create-job --name python-job-cli --role Glue_DefaultRole --command '{"Name" : "pythonshell", "PythonVersion": "3.9", "ScriptLocation" : "s3://aws-glue-scripts-123456789012-us-east-1/Admin/python-job-cli.py"}' --max-capacity 0.0625

您使用 Amazon 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 参数。对于 Python shell 作业,无法使用 --allocated-capacity 参数。

适用于 Python shell 作业的支持的库

在使用 Python 3.9 的 Python shell 中,您可以选择库集来使用预先打包的库集来满足您的需求。您可以使用 library-set 选项选择库集。有效值为 analyticsnone

用于运行 Python shell 作业的环境支持以下库:

Python 版本 Python 3.6 Python 3.9
库集 不适用 分析 none
avro 1.11.0
awscli 116.242 1.23.5 1.23.5
awswrangler 2.15.1
botocore 1.12.232 1.23.5 1.23.5
boto3 1.9.203 1.22.5
elasticsearch 8.2.0
numpy 1.16.2 1.22.3
pandas 0.24.2 1.4.2
psycopg2 2.9.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。以下示例显示了一个可在 Python shell 作业中使用的 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 库的限制:

  • 不支持在 Python 3.9 中添加 .egg 文件。

提供您自己的 Python 库

使用 PIP

使用 Python 3.9 的 Python shell 允许您在任务层面提供其他 Python 模块或不同版本。您可以结合使用 --additional-python-modules 选项与一系列逗号分隔的 Python 模块,以添加新模块或更改现有模块的版本。

例如,要更新或添加新的 scikit-learn 模块,请使用以下键/值:"--additional-python-modules", "scikit-learn==0.21.3"

此外,在 --additional-python-modules 选项中,您可以指定指向 Python Wheel 模块的 Amazon S3 路径。例如:

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

Amazon Glue 使用 Python Package Installer(pip3)来安装其他模块。您可以将 python-modules-installer-option 指定的其他选项传递到 pip3,用于安装模块。pip3 的任何不兼容或限制都将适用。

注意

我们建议使用为 Python 3.9 构建的库,以避免未来可能出现的不兼容性。

使用 Egg 或 Whl 文件

您可能已将一个或多个 Python 库打包为一个 .egg.whl 文件。如果是这样的话,您可以使用“—extra-py-files”标记下的 Amazon Command Line Interface (Amazon 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 Linux 子系统 (WSL)。

创建 Python.egg 或 .whl 文件
  1. 在 Virtual Private Cloud(VPC)中创建 Amazon Redshift 集群,并且将一些数据添加到表。

  2. 为您用于创建集群的 VPC-SecurityGroup-Subnet 组合创建 Amazon 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_nameuserpassword_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://MyBucket/python/library/redshift_module-0.1-py2.7.eggs3://MyBucket/python/library/redshift_module-0.1-py2.7-none-any.whl

  10. 创建一个要用作 Amazon 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://MyBucket/python/library/redshift_test.py

  12. 使用此脚本创建一个 Python shell 作业。在 Amazon Glue 控制台上,使用 Job properties (任务属性) 页面上的 Python library path (Python 库路径) 框指定 .egg/.whl 文件的路径。如果您有多个 .egg/.whl 文件和 Python 文件,请在此框中提供逗号分隔的列表。

    修改或重命名 .egg 文件时,文件名必须使用由“python setup.py bdist_egg”命令生成的默认名称,或者必须遵守 Python 模块命名约定。有关更多信息,请参阅 Python 代码风格指南

    借助 Amazon 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 表中创建的行。