Anu*_*raz 17 python amazon-s3 aws-glue
我有一个用 python 编写的 ETL 作业,它由具有以下目录结构的多个脚本组成;
\n\nmy_etl_job\n |\n |--services\n | |\n | |-- __init__.py\n | |-- dynamoDB_service.py\n |\n |-- __init__.py\n |-- main.py\n |-- logger.py\nRun Code Online (Sandbox Code Playgroud)\n\nmain.py是从上述目录导入其他脚本的入口点脚本。上面的代码上传到由 dev 端点创建的 ETL 集群后,在 dev-endpoint 上运行得非常好。既然现在我想在生产中运行它,我想为它创建一个合适的粘合作业。my_etl_job但是当我以format压缩整个目录时.zip,将其上传到 artifacts s3 存储桶中,并将 .zip 文件位置指定到脚本位置,如下所示
s3://<bucket_name>/etl_jobs/my_etl_job.zip\nRun Code Online (Sandbox Code Playgroud)\n\n这是我在胶水作业 UI 仪表板上看到的代码;
\n\nPK\n \xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbdP__init__.pyUX\xef\xbf\xbd\'\xef\xbf\xbd^"\xef\xbf\xbd^A\xef\xbf\xbd\xef\xbf\xbd)PK#7\xef\xbf\xbdP logger.pyUX\xef\xbf\xbd\xef\xbf\xbd^1\xef\xbf\xbd\xef\xbf\xbd^A\xef\xbf\xbd\xef\xbf\xbd)]\xef\xbf\xbdMk\xef\xbf\xbd0\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbda\xef\xbf\xbd&v+\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbdA\xef\xbf\xbdB\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd`x\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbdq\xef\xbf\xbd\xef\xbf\xbd} ...AND ALLOT MORE...\nRun Code Online (Sandbox Code Playgroud)\n\n似乎胶水作业不接受 .zip 格式?如果是,那么我应该使用什么压缩格式?
\n\n更新: \n我检查了粘合作业可以选择接受额外的文件,Referenced files path其中我提供了上述文件的所有路径的逗号分隔列表,并将 script_location 更改为仅引用main.py文件路径。但这也没有奏效。粘合作业抛出错误 no module found logger (我在 logger.py 文件中定义了这个模块)
小智 13
您必须将zip文件作为额外的python lib传递,或者为代码包构建一个wheel包并将zip或wheel上传到s3,提供与额外的python lib选项相同的路径
注意:将您的主要函数编写在glue控制台中,从zipped/wheel依赖项中引用所需的函数,您的脚本位置永远不应该是zip文件
https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-python-libraries.html
我正在使用 Glue v2.0Spark作业类型(而不是Python shell)的 Glue v2.0 并遇到了类似的问题。
除了之前有关 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}")
Run Code Online (Sandbox Code Playgroud)
我可以看到当前工作目录包含我的 zip 文件。
但sys.path不包括当前工作目录。
所以Python无法导入我的zip文件,导致ImportError: No module named错误。
为了解决导入问题,我只需将以下代码添加到我的 Glue Job 脚本中。
import sys
sys.path.insert(0, "utils.zip")
import utils
Run Code Online (Sandbox Code Playgroud)
供参考:我的内容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
Run Code Online (Sandbox Code Playgroud)
(注意__init__.py模块导入必须存在才能正常工作)
我的本地项目文件夹结构
my_job_stuff
|-- utils
| |-- __init__.py
| |-- utils.py
|-- main.py
Run Code Online (Sandbox Code Playgroud)