将 Python 库与 Amazon Glue 一起使用
Amazon Glue 允许您安装额外的 Python 模块和库,以便与 Amazon Glue ETL 一起使用。
主题
使用 Pip 在 Amazon Glue 2.0 中安装其他 Python 模块
Amazon Glue 使用 Python Package Installer(pip3)安装 Amazon Glue ETL 使用的其他模块。您可以结合使用 --additional-python-modules 选项与一系列逗号分隔的 Python 模块,以添加新模块或更改现有模块的版本。您可以将 python-modules-installer-option 指定的其他选项传递到 pip3,用于安装模块。pip3 的任何不兼容或限制都将适用。
例如,要更新或添加新的 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
您可以在 DefaultArguments 或 NonOverridableArguments 任务参数,或者 Amazon Glue 控制台的 Job parameters (任务参数) 中指定 --additional-python-modules 选项。
Amazon Glue 2.0 版中已提供的 Python 模块
Amazon Glue 2.0 版支持以下开箱即用的 Python 模块:
boto3==1.12.4
botocore==1.15.4
certifi==2019.11.28
chardet==3.0.4
cycler==0.10.0
Cython==0.29.15
docutils==0.15.2
enum34==1.1.9
fsspec==0.6.2
idna==2.9
jmespath==0.9.4
joblib==0.14.1
kiwisolver==1.1.0
matplotlib==3.1.3
mpmath==1.1.0
numpy==1.18.1
pandas==1.0.1
patsy==0.5.1
pmdarima==1.5.3
ptvsd==4.3.2
pyarrow==0.16.0
pydevd==1.9.0
pyhocon==0.3.54
PyMySQL==0.9.3
pyparsing==2.4.6
python_dateutil==2.8.1
pytz==2019.3
requests==2.23.0
s3fs==0.4.0
s3transfer==0.3.3
scikit-learn==0.22.1
scipy==1.4.1
setuptools==45.2.0
setuptools==45.2.0
six==1.14.0
statsmodels==0.11.1
subprocess32==3.5.4
sympy==1.5.1
tbats==1.0.9
urllib3==1.25.8
压缩库以用于包含
除非库包含在单个 .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。
类似地,您可以使用 Amazon 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 来更新它所加载的库。
如果您将 Zeppelin Notebook 与开发终端节点一起使用,则在从 .zip 文件中导入一个或多个包之前,需要调用以下 PySpark 函数:
sc.addPyFile("/home/glue/downloads/python/yourZipFileName.zip")
在作业或作业运行中使用 Python 库
当您在控制台上创建新任务时,可以通过选择 Script Libraries and job parameters (optional) (脚本库和任务参数 (可选)) 并输入完整的 Amazon S3 库路径来指定一个或多个库 .zip 格式文件(方法与创建开发终端节点时相同):
s3://bucket/prefix/lib_A.zip,s3://bucket_B/prefix/lib_X.zip
如果您正在调用 CreateJob (create_job),则可以使用 --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'})