将 Python 库与 AWS Glue 一起使用 - AWS Glue

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

将 Python 库与 AWS Glue 一起使用

AWS Glue 允许您安装额外的 Python 模块和库,以便与 AWS Glue ETL 一起使用。

使用 pip 在 AWS Glue 2.0+ 中安装其他 Python 模块

AWS Glue 使用 Python Package Installer(pip3)安装 AWS Glue ETL 使用的其他模块。您可以将 --additional-python-modules 参数与逗号分隔的 Python 模块列表结合使用,以添加新模块或更改现有模块的版本。通过将分发上传到 Amazon S3,然后在模块列表中包含到 Amazon S3 对象的路径,您可以安装库的自定义分发。

您可以使用 --python-modules-installer-option 参数将其他选项传递给 pip3。例如,您可以传递 "--upgrade" 以升级 "--additional-python-modules" 指定的包。有关更多示例,请参阅使用 AWS Glue 2.0 从 Spark ETL 工作负载仪表盘构建 Python 模块

如果您的 Python 依赖项以传递方式依赖于原生编译代码,则可能会遇到以下限制:AWS Glue 不支持在作业环境中编译原生代码。但是,AWS Glue 作业在 Amazon Linux 2 环境中运行。您可通过 Wheel 分发以编译后的形式提供原生依赖项。

例如,要更新或添加新的 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/ephem-3.7.7.1-cp37-cp37m-linux_x86_64.whl,s3://aws-glue-native-spark/tests/j4.2/fbprophet-0.6-py3-none-any.whl,scikit-learn==0.21.3

您可以在 AWS Glue 控制台的 Job parameters(作业参数)字段中指定 --additional-python-modules,也可以通过在 AWS SDK 中更改作业参数指定它。有关设置作业参数的更多信息,请参阅 AWS Glue 作业参数

包含具有 PySpark 原生功能的 Python 文件

AWS Glue 使用 PySpark 以在 AWS Glue ETL 作业中包含 Python 文件。如果可用,您希望使用 --additional-python-modules 管理依赖项。您可以使用 --extra-py-files 作业参数以包含 Python 文件。依赖关系必须托管在 Amazon S3 中,参数值应为逗号分隔的 Amazon S3 路径列表,且不含空格。此功能的行为类似于您将在 Spark 中使用的 Python 依赖项管理。有关 Spark 中 Python 依赖项管理的更多信息,请参阅 Apache Spark 文档中的 Using PySpark Native Features(使用 PySpark 原生功能)页面。如果其他代码未打包,或您使用现有工具链迁移 Spark 程序以管理依赖项时,--extra-py-files 非常有用。为使依赖项工具可维护,您必须在提交之前捆绑依赖项。

使用视觉对象转换的编程脚本

使用 AWS Glue Studio 可视化界面创建 AWS Glue 作业时,您可以使用托管式的数据转换节点和自定义视觉对象转换来转换数据。有关托管式数据转换节点的更多信息,请参阅 编辑 AWS Glue 托管数据转换节点。有关自定义视觉对象转换的更多信息,请参阅 AWS Glue 自定义视觉转换 。只有当作业的语言设置为使用 Python 时,才能生成使用视觉对象转换的脚本。

生成使用视觉对象转换的 AWS Glue 作业时,AWS Glue Studio 将使用作业配置中的 --extra-py-files 参数将这些转换包含在运行时环境中。有关任务参数的更多信息,请参阅 AWS Glue 作业参数。对生成的脚本或运行时环境进行更改时,需要保留此作业配置以确保脚本的成功运行。

AWS Glue 中已提供的 Python 模块

要更改这些已提供模块的版本,请使用 --additional-python-modules 作业参数提供新版本。

AWS Glue version 2.0

AWS Glue 2.0 版包括以下开箱即用的 Python 模块:

  • avro-python3==1.10.0

  • awscli==1.27.60

  • boto3==1.12.4

  • botocore==1.15.4

  • certifi==2019.11.28

  • chardet==3.0.4

  • click==8.1.3

  • colorama==0.4.4

  • cycler==0.10.0

  • Cython==0.29.15

  • docutils==0.15.2

  • enum34==1.1.9

  • fsspec==0.6.2

  • idna==2.9

  • importlib-metadata==6.0.0

  • jmespath==0.9.4

  • joblib==0.14.1

  • kiwisolver==1.1.0

  • matplotlib==3.1.3

  • mpmath==1.1.0

  • nltk==3.5

  • numpy==1.18.1

  • pandas==1.0.1

  • patsy==0.5.1

  • pmdarima==1.5.3

  • ptvsd==4.3.2

  • pyarrow==0.16.0

  • pyasn1==0.4.8

  • pydevd==1.9.0

  • pyhocon==0.3.54

  • PyMySQL==0.9.3

  • pyparsing==2.4.6

  • python-dateutil==2.8.1

  • pytz==2019.3

  • PyYAML==5.3.1

  • regex==2022.10.31

  • requests==2.23.0

  • rsa==4.7.2

  • s3fs==0.4.0

  • s3transfer==0.3.3

  • scikit-learn==0.22.1

  • scipy==1.4.1

  • setuptools==45.2.0

  • six==1.14.0

  • spark==1.0

  • statsmodels==0.11.1

  • subprocess32==3.5.4

  • sympy==1.5.1

  • tbats==1.0.9

  • tqdm==4.64.1

  • typing-extensions==4.4.0

  • urllib3==1.25.8

  • wheel==0.35.1

  • zipp==3.12.0

AWS Glue 3.0 版

AWS Glue 3.0 版包括以下开箱即用的 Python 模块:

  • aiobotocore==1.4.2

  • aiohttp==3.8.3

  • aioitertools==0.11.0

  • aiosignal==1.3.1

  • async-timeout==4.0.2

  • asynctest==0.13.0

  • attrs==22.2.0

  • avro-python3==1.10.2

  • boto3==1.18.50

  • botocore==1.21.50

  • certifi==2021.5.30

  • chardet==3.0.4

  • charset-normalizer==2.1.1

  • click==8.1.3

  • cycler==0.10.0

  • Cython==0.29.4

  • docutils==0.17.1

  • enum34==1.1.10

  • frozenlist==1.3.3

  • fsspec==2021.8.1

  • idna==2.10

  • importlib-metadata==6.0.0

  • jmespath==0.10.0

  • joblib==1.0.1

  • kiwisolver==1.3.2

  • matplotlib==3.4.3

  • mpmath==1.2.1

  • multidict==6.0.4

  • nltk==3.6.3

  • numpy==1.19.5

  • packaging==23.0

  • pandas==1.3.2

  • patsy==0.5.1

  • pillow==9.4.0

  • pip==23.0

  • pmdarima==1.8.2

  • ptvsd==4.3.2

  • pyarrow==5.0.0

  • pydevd==2.5.0

  • pyhocon==0.3.58

  • pymysql==1.0.2

  • pyparsing==2.4.7

  • python-dateutil==2.8.2

  • pytz==2021.1

  • PyYAML==5.4.1

  • regex==2022.10.31

  • requests==2.23.0

  • s3fs==2021.8.1

  • s3transfer==0.5.0

  • scikit-learn==0.24.2

  • scipy==1.7.1

  • six==1.16.0

  • spark==1.0

  • statsmodels==0.12.2

  • subprocess32==3.5.4

  • sympy==1.8

  • tbats==1.1.0

  • threadpoolctl==3.1.0

  • tqdm==4.64.1

  • typing_extensions==4.4.0

  • urllib3==1.25.11

  • wheel==0.37.0

  • wrapt==1.14.1

  • yarl==1.8.2

  • zipp==3.12.0

AWS Glue 4.0 版

AWS Glue 4.0 版包括以下开箱即用的 Python 模块:

  • aiobotocore==2.4.1

  • aiohttp==3.8.3

  • aioitertools==0.11.0

  • aiosignal==1.3.1

  • async-timeout==4.0.2

  • asynctest==0.13.0

  • attrs==22.2.0

  • avro-python3==1.10.2

  • boto3==1.24.70

  • botocore==1.27.59

  • certifi==2021.5.30

  • chardet==3.0.4

  • charset-normalizer==2.1.1

  • click==8.1.3

  • cycler==0.10.0

  • Cython==0.29.32

  • docutils==0.17.1

  • enum34==1.1.10

  • frozenlist==1.3.3

  • fsspec==2021.8.1

  • idna==2.10

  • importlib-metadata==5.0.0

  • jmespath==0.10.0

  • joblib==1.0.1

  • kaleido==0.2.1

  • kiwisolver==1.4.4

  • matplotlib==3.4.3

  • mpmath==1.2.1

  • multidict==6.0.4

  • nltk==3.7

  • numpy==1.23.5

  • packaging==23.0

  • pandas==1.5.1

  • patsy==0.5.1

  • pillow==9.4.0

  • pip==23.0.1

  • plotly==5.16.0

  • pmdarima==2.0.1

  • ptvsd==4.3.2

  • pyarrow==10.0.0

  • pydevd==2.5.0

  • pyhocon==0.3.58

  • pymysql==1.0.2

  • pyparsing==2.4.7

  • python-dateutil==2.8.2

  • pytz==2021.1

  • PyYAML==6.0.1

  • regex==2022.10.31

  • requests==2.23.0

  • s3fs==2022.11.0

  • s3transfer==0.6.0

  • scikit-learn==1.1.3

  • scipy==1.9.3

  • setuptools==49.1.3

  • six==1.16.0

  • statsmodels==0.13.5

  • subprocess32==3.5.4

  • sympy==1.8

  • tbats==1.1.0

  • threadpoolctl==3.1.0

  • tqdm==4.64.1

  • typing_extensions==4.4.0

  • urllib3==1.25.11

  • wheel==0.37.0

  • wrapt==1.14.1

  • yarl==1.8.2

  • zipp==3.10.0

压缩库以用于包含

除非库包含在单个 .py 文件中,否则它应打包到 .zip 存档中。包目录应该位于存档文件的根部,并且必须包含一个针对该包的 __init__.py 文件。然后,Python 将能够以正常方式导入包。

如果您的库仅在一个 .py 文件中包含单个 Python 模块,您无需将其放入 .zip 文件。

在开发终端节点中加载 Python 库

如果对不同的 ETL 脚本使用不同的库集,则可以为每个集设置单独的开发终端节点,也可以覆盖每次您切换脚本时开发终端节点加载的库 .zip 文件。

在创建开发终端节点时,您可以使用控制台为其指定一个或多个库 .zip 文件。在分配名称和 IAM 角色后,请选择 Script Libraries and job parameters (optional) (脚本库和任务参数(可选)),然后在 Python library path (脚本库路径) 框中输入库 .zip 文件的完整 Amazon S3 路径。例如:

s3://bucket/prefix/site-packages.zip

如果需要,您可以指定文件的多个完整路径并使用逗号分隔,但不能有空格,如下所示:

s3://bucket/prefix/lib_A.zip,s3://bucket_B/prefix/lib_X.zip

如果您更新这些 .zip 文件,则可以使用控制台将其重新导入到您的开发终端节点。导航到所涉开发人员终端节点,选中它旁边的框,然后从 Action 菜单中选择 Update ETL libraries

类似地,您可以使用 AWS Glue API 指定库文件。当您通过调用 CreateDevEndpoint 操作(Python:create_dev_endpoint) 创建开发终端节点时,可以通过如下所示的调用在 ExtraPythonLibsS3Path 参数中指定库的一个或多个完整路径:

dep = glue.create_dev_endpoint( EndpointName="testDevEndpoint", RoleArn="arn:aws:iam::123456789012", SecurityGroupIds="sg-7f5ad1ff", SubnetId="subnet-c12fdba4", PublicKey="ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCtp04H/y...", NumberOfNodes=3, ExtraPythonLibsS3Path="s3://bucket/prefix/lib_A.zip,s3://bucket_B/prefix/lib_X.zip")

当您更新一个开发终端节点时,还可以通过在调用 UpdateDevEndpoint (update_dev_endpoint) 时使用 DevEndpointCustomLibraries 对象并将 UpdateEtlLibraries 参数设置为 True 来更新它所加载的库。

在作业或作业运行中使用 Python 库

当您在控制台上创建新任务时,可以通过选择 Script Libraries and job parameters (optional) (脚本库和任务参数 (可选)) 并输入完整的 Amazon S3 库路径来指定一个或多个库 .zip 格式文件(方法与创建开发终端节点时相同):

s3://bucket/prefix/lib_A.zip,s3://bucket_B/prefix/lib_X.zip

如果您正在调用 CreateJob (创建任务),则可以使用 --extra-py-files 默认参数指定默认库的一个或多个完整路径,如下所示:

job = glue.create_job(Name='sampleJob', Role='Glue_DefaultRole', Command={'Name': 'glueetl', 'ScriptLocation': 's3://my_script_bucket/scripts/my_etl_script.py'}, DefaultArguments={'--extra-py-files': 's3://bucket/prefix/lib_A.zip,s3://bucket_B/prefix/lib_X.zip'})

然后,当您启动作业运行时,可以使用其他设置覆盖默认库设置:

runId = glue.start_job_run(JobName='sampleJob', Arguments={'--extra-py-files': 's3://bucket/prefix/lib_B.zip'})