在 Amazon Glue 中添加 Python Shell 作业
可以使用 Python shell 作业将 Python 脚本作为 Amazon Glue 中的 shell 运行。利用 Python 外壳作业,您可以运行与 Python 2.7 和 Python 3.6 兼容的脚本。
您不能将作业书签用于 Python shell 作业。适用于 Apache Spark 作业的大多数其他功能也适用于 Python shell 作业。
用于 Amazon CloudWatch Logs 组的 Python shell 任务输出为 /aws-glue/python-jobs/output
。有关错误,请参阅日志组 /aws-glue/python-jobs/errors
。
定义 Python Shell 作业的作业属性
当您在控制台上定义 Python shell 作业时(请参阅在 Amazon Glue 控制台上处理作业),请提供以下一些属性:
- IAM 角色
-
指定用于对运行任务和访问数据存储所用的资源进行授权的 Amazon Identity and Access Management(IAM)角色。有关在 Amazon Glue 中运行作业的权限的更多信息,请参阅 管理 Amazon Glue 资源的访问权限。
- 类型
-
选择 Python shell 命令以使用名为
pythonshell
的作业运行 Python 脚本。 - Python 版本
-
选择 Python 版本。默认为 Python 3。
- 自定义脚本
-
脚本中的代码定义了作业的过程逻辑。您需要在 Amazon Simple Storage Service(Amazon S3)中提供脚本名称和位置。确认没有与路径中的脚本目录同名的文件。要了解有关使用脚本的更多信息,请参阅 在 Amazon Glue 中编辑脚本。
- 现有脚本或新脚本
-
脚本中的代码定义了作业的过程逻辑。您可以在 Python 2.7 或 Python 3.6 中编写脚本代码。您可以在 Amazon Glue 控制台上编辑脚本,但脚本不是由 Amazon Glue 生成的。
- 最大容量
-
此作业运行时可分配的 Amazon Glue 数据处理单元 (DPU) 的最大数量。DPU 是对处理能力的相对度量,它由 4 个 vCPU 的计算容量和 16GB 内存组成。有关更多信息,请参阅Amazon Glue定价
。 您可以将该值设置为 0.0625 或 1。默认值为 0.0625。
有关其他属性的说明,请参阅 定义 Spark 任务的任务属性。有关如何使用 Amazon Glue 控制台添加作业的更多信息,请参阅 在 Amazon Glue 控制台上处理作业。
您还可以使用 Amazon 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"}'
您使用 Amazon 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
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)
Limitations
请注意以下有关打包 Python 库的限制:
不支持在 Windows 10 Pro 上使用 Python 3.7 创建
.egg
文件。支持在 WSL(Windows Linux 子系统,由 Windows 10 Pro 托管)上使用 Python 3.6 创建
.egg
文件。
提供您自己的 Python 库
您可能已将一个或多个 Python 库打包为一个 .egg
或 .whl
文件。如果是这样的话,您可以使用“Amazon Command Line Interface”标记下的 Amazon CLI (—extra-py-files
) 将其指定到您的作业,如以下示例所示。
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 文件
-
在 Virtual Private Cloud(VPC)中创建 Amazon Redshift 集群,并且将一些数据添加到表。
-
为您用于创建集群的 VPC-SecurityGroup-Subnet 组合创建 Amazon 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
。 -
-
创建一个要用作 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 -
将上述文件上载到 Amazon S3。在此示例中,上传的文件路径为
s3://MyBucket/python/library/redshift_test.py
。 -
使用此脚本创建一个 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
表中创建的行。