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

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

在 AWS Glue 中添加 Python Shell 作业

可以使用 Python shell 作业将 Python 脚本作为 AWS Glue 中的 shell 运行。利用 Python 外壳作业,您可以运行与 Python 2.7 和 Python 3.6 兼容的脚本。

您不能将作业书签用于 Python shell 作业。适用于 Apache Spark 作业的大多数其他功能也适用于 Python shell 作业。

Python shell 作业输出的 Amazon CloudWatch Logs 组是 /aws-glue/python-jobs/output。有关错误,请参阅日志组 /aws-glue/python-jobs/errors

定义 Python Shell 作业的作业属性

当您在控制台上定义 Python shell 作业时(请参阅在 AWS Glue 控制台上处理作业),请提供以下一些属性:

IAM 角色

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

类型

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

Python 版本

选择 Python 版本。默认为 Python 3。

自定义脚本

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

现有脚本或新脚本

脚本中的代码定义了作业的过程逻辑。您可以在 Python 2.7 或 Python 3.6 中编写脚本代码。您可以在 AWS Glue 控制台上编辑脚本,但脚本不是由 AWS Glue 生成的。

最大容量

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

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

有关其他属性的说明,请参阅定义作业属性。有关如何使用 AWS Glue 控制台添加作业的更多信息,请参阅在 AWS Glue 控制台上处理作业

您也可以使用 AWS CLI 创建 Python shell 作业,如以下示例中所示。

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 shell 作业使用的最大容量,请提供 --max-capacity 参数。对于 Python shell 作业,无法使用 --allocated-capacity 参数。

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

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

  • 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 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 库的限制:

  • 不支持在 Windows 10 Pro 上使用 Python 3.7 创建 .egg 文件。

  • 支持在 WSL(Windows Linux 子系统,由 Windows 10 Pro 托管)上使用 Python 3.6 创建 .egg 文件。

提供您自己的 Python 库

您可能已将一个或多个 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 Linux 子系统 (WSL)。

创建 Python.egg 或 .whl 文件

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

  2. 为您用于创建集群的 VPC-SecurityGroup-Subnet 组合创建 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_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. 创建一个要用作 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://MyBucket/python/library/redshift_test.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://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 表中创建的行。