如何为 AWS 胶水工作使用额外的文件
How to use extra files for AWS glue job
我有一个用 python 编写的 ETL 作业,它由具有以下目录结构的多个脚本组成;
my_etl_job
|
|--services
| |
| |-- __init__.py
| |-- dynamoDB_service.py
|
|-- __init__.py
|-- main.py
|-- logger.py
main.py
是从上述目录导入其他脚本的入口点脚本。在上传到由开发端点创建的 ETL 集群后,上面的代码 运行 在开发端点上完全没问题。因为现在我想 运行 它在生产中,我想为它创建一个合适的粘合作业。但是,当我将整个目录 my_etl_job
压缩为 .zip
格式时,将其上传到 artifacts s3 存储桶中,并将 .zip 文件位置指定为脚本位置,如下所示
s3://<bucket_name>/etl_jobs/my_etl_job.zip
这是我在粘合作业 UI 仪表板上看到的代码;
PK
���P__init__.pyUX�'�^"�^A��)PK#7�P logger.pyUX��^1��^A��)]�Mk�0����a�&v+���A�B���`x����q��} ...AND ALLOT MORE...
粘合作业似乎不接受 .zip 格式?如果是,那么我应该使用什么压缩格式?
更新:
我检查了胶水作业是否可以选择接收额外的文件 Referenced files path
,我在其中提供了上述文件所有路径的逗号分隔列表,并将 script_location 更改为仅引用 main.py
文件路径。但这也没有用。胶水作业抛出错误,没有找到模块记录器(我在 logger.py 文件中定义了这个模块)
您必须将 zip 文件作为 extra python lib 传递,或者为代码包构建一个 wheel 包并将 zip 或 wheel 上传到 s3,提供与 extra [=18] 相同的路径=] 库选项
注意:将您的主要功能编写在自己的 glue 控制台中,从 zipped/wheel 依赖项中引用所需的功能,您的脚本位置绝不能是 zip 文件
https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-python-libraries.html
- 你的主要工作不应该被压缩。那应该是一个py文件本身。在这种情况下,这就是你 main.py。这不应该是 zip 文件的一部分。
- 您在代码中引用的任何其他库文件都可以压缩或制作为 wheel 文件,并通过 extra-files 选项引用。您的文件夹结构可以稍微修改以包含您在 main 中引用的所有这些额外的 py 文件,最好像下面这样。如果您有更多服务,请考虑进一步细分,但下面是一个简单的示例
my_etl_job
|
|--corelib
| |
| |--__init__.py
| |-- services
| |
| | -- dynamoDB_service.py
| | -- logger.py
|
|-- main.py
然后您可以将 main.py 中的 dynamodbservices 模块导入为 corelib.services.dynamoDB_service。
当你准备你的库时,只需转到 corelib 之前的文件夹并将文件夹压缩如下
zip -r corelib.zip corelib/
然后您可以将 crelib.zip 添加为胶水中的额外文件。 (你可以根据自己的喜好准备一个wheel文件to.its)
我使用 Glue v2.0 使用 Spark 作业类型(而不是 Python shell) 并且遇到了类似的问题。
除了之前关于 zip 文件的回答外,还讨论了:
main.py
不应压缩。
.zip
文件存档 corelib.zip
(或 services.zip
)应包含 corelib
(或 services
)文件夹及其内容。
我按照这个操作,但在尝试导入我的模块时仍然遇到 ImportError: No module named
错误。
将以下片段添加到我的 Glue 作业脚本后:
import sys
import os
print(f"os.getcwd()={os.getcwd()}")
print(f"os.listdir('.')={os.listdir('.')}")
print(f"sys.path={sys.path}")
我可以看到当前工作目录包含我的 zip 文件。
但是sys.path
没有包含当前工作目录。
所以 Python 无法导入我的 zip 文件,导致 ImportError: No module named
错误。
为了解决导入问题,我只是将以下代码添加到我的 Glue 作业脚本中。
import sys
sys.path.insert(0, "utils.zip")
import utils
供参考:
我的utils.zip
的内容
Archive: utils.zip
Length Method Size Cmpr Date Time CRC-32 Name
-------- ------ ------- ---- ---------- ----- -------- ----
0 Defl:N 5 0% 01-01-2049 00:00 00000000 __init__.py
6603 Defl:N 1676 75% 01-01-2049 00:00 f4551ccb utils.py
-------- ------- --- -------
6603 1681 75% 2 files
(请注意,模块导入必须存在 __init__.py
)
我的本地项目文件夹结构
my_job_stuff
|-- utils
| |-- __init__.py
| |-- utils.py
|-- main.py
我有一个用 python 编写的 ETL 作业,它由具有以下目录结构的多个脚本组成;
my_etl_job
|
|--services
| |
| |-- __init__.py
| |-- dynamoDB_service.py
|
|-- __init__.py
|-- main.py
|-- logger.py
main.py
是从上述目录导入其他脚本的入口点脚本。在上传到由开发端点创建的 ETL 集群后,上面的代码 运行 在开发端点上完全没问题。因为现在我想 运行 它在生产中,我想为它创建一个合适的粘合作业。但是,当我将整个目录 my_etl_job
压缩为 .zip
格式时,将其上传到 artifacts s3 存储桶中,并将 .zip 文件位置指定为脚本位置,如下所示
s3://<bucket_name>/etl_jobs/my_etl_job.zip
这是我在粘合作业 UI 仪表板上看到的代码;
PK
���P__init__.pyUX�'�^"�^A��)PK#7�P logger.pyUX��^1��^A��)]�Mk�0����a�&v+���A�B���`x����q��} ...AND ALLOT MORE...
粘合作业似乎不接受 .zip 格式?如果是,那么我应该使用什么压缩格式?
更新:
我检查了胶水作业是否可以选择接收额外的文件 Referenced files path
,我在其中提供了上述文件所有路径的逗号分隔列表,并将 script_location 更改为仅引用 main.py
文件路径。但这也没有用。胶水作业抛出错误,没有找到模块记录器(我在 logger.py 文件中定义了这个模块)
您必须将 zip 文件作为 extra python lib 传递,或者为代码包构建一个 wheel 包并将 zip 或 wheel 上传到 s3,提供与 extra [=18] 相同的路径=] 库选项
注意:将您的主要功能编写在自己的 glue 控制台中,从 zipped/wheel 依赖项中引用所需的功能,您的脚本位置绝不能是 zip 文件
https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-python-libraries.html
- 你的主要工作不应该被压缩。那应该是一个py文件本身。在这种情况下,这就是你 main.py。这不应该是 zip 文件的一部分。
- 您在代码中引用的任何其他库文件都可以压缩或制作为 wheel 文件,并通过 extra-files 选项引用。您的文件夹结构可以稍微修改以包含您在 main 中引用的所有这些额外的 py 文件,最好像下面这样。如果您有更多服务,请考虑进一步细分,但下面是一个简单的示例
my_etl_job
|
|--corelib
| |
| |--__init__.py
| |-- services
| |
| | -- dynamoDB_service.py
| | -- logger.py
|
|-- main.py
然后您可以将 main.py 中的 dynamodbservices 模块导入为 corelib.services.dynamoDB_service。 当你准备你的库时,只需转到 corelib 之前的文件夹并将文件夹压缩如下
zip -r corelib.zip corelib/
然后您可以将 crelib.zip 添加为胶水中的额外文件。 (你可以根据自己的喜好准备一个wheel文件to.its)
我使用 Glue v2.0 使用 Spark 作业类型(而不是 Python shell) 并且遇到了类似的问题。
除了之前关于 zip 文件的回答外,还讨论了:
main.py
不应压缩。.zip
文件存档corelib.zip
(或services.zip
)应包含corelib
(或services
)文件夹及其内容。
我按照这个操作,但在尝试导入我的模块时仍然遇到 ImportError: No module named
错误。
将以下片段添加到我的 Glue 作业脚本后:
import sys
import os
print(f"os.getcwd()={os.getcwd()}")
print(f"os.listdir('.')={os.listdir('.')}")
print(f"sys.path={sys.path}")
我可以看到当前工作目录包含我的 zip 文件。
但是sys.path
没有包含当前工作目录。
所以 Python 无法导入我的 zip 文件,导致 ImportError: No module named
错误。
为了解决导入问题,我只是将以下代码添加到我的 Glue 作业脚本中。
import sys
sys.path.insert(0, "utils.zip")
import utils
供参考:
我的utils.zip
Archive: utils.zip
Length Method Size Cmpr Date Time CRC-32 Name
-------- ------ ------- ---- ---------- ----- -------- ----
0 Defl:N 5 0% 01-01-2049 00:00 00000000 __init__.py
6603 Defl:N 1676 75% 01-01-2049 00:00 f4551ccb utils.py
-------- ------- --- -------
6603 1681 75% 2 files
(请注意,模块导入必须存在 __init__.py
)
我的本地项目文件夹结构
my_job_stuff
|-- utils
| |-- __init__.py
| |-- utils.py
|-- main.py