[英]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 集群后,上面的代码在开发端点上运行得很好。 因为现在我想在生产中运行它,所以我想为它创建一个合适的粘合作业。 但是,当我以.zip
格式压缩整个目录my_etl_job
时,将其上传到 artifacts s3 存储桶中,并将 .zip 文件位置指定为脚本位置,如下所示
s3://<bucket_name>/etl_jobs/my_etl_job.zip
这是我在 glue job 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 文件作为额外的 python lib 传递,或者为代码 package 构建一个轮子 package 并将 zip 或轮子上传到 s3,提供与额外的 python lib 选项相同的路径
注意:将您的主要 function 写入自己的胶水控制台,从 zipped/wheel 依赖项中引用所需的 function,您的脚本位置永远不应是 zip 文件
https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-python-libraries.html
我正在使用 Glue v2.0 使用Spark作业类型(而不是Python shell )并且遇到了类似的问题。
除了之前关于 zip 文件的回答外,还讨论了:
main.py
.zip
文件存档corelib.zip
(或services.zip
)应该包含corelib
(或services
)文件夹及其内容。 我遵循了这一点,但在尝试导入我的模块时仍然收到ImportError: No module named
错误。
将以下代码片段添加到我的 Glue Job 脚本后:
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 Job 脚本中。
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
my_etl_job
|
|--corelib
| |
| |--__init__.py
| |-- services
| |
| | -- dynamoDB_service.py
| | -- logger.py
|
|-- main.py
然后,您可以在 main.py 中将 dynamodbservices 模块导入为 corelib.services.dynamoDB_service。 当你准备你的库时,只需 go 到 corelib 之前的文件夹和 zip 到如下文件夹
zip -r corelib.zip corelib/
然后,您可以将 crelib.zip 添加为 glue 中的额外文件。 (您可以根据自己的喜好准备一个轮文件)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.