如何使用额外文件进行 AWS 粘合作业

Anu*_*raz 17 python amazon-s3 aws-glue

我有一个用 python 编写的 ETL 作业,它由具有以下目录结构的多个脚本组成;

\n\n
my_etl_job\n |\n |--services\n |  |\n |  |-- __init__.py\n |  |-- dynamoDB_service.py\n |\n |-- __init__.py\n |-- main.py\n |-- logger.py\n
Run Code Online (Sandbox Code Playgroud)\n\n

main.py是从上述目录导入其他脚本的入口点脚本。上面的代码上传到由 dev 端点创建的 ETL 集群后,在 dev-endpoint 上运行得非常好。既然现在我想在生产中运行它,我想为它创建一个合适的粘合作业。my_etl_job但是当我以format压缩整个目录时.zip,将其上传到 artifacts s3 存储桶中,并将 .zip 文件位置指定到脚本位置,如下所示

\n\n
s3://<bucket_name>/etl_jobs/my_etl_job.zip\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是我在胶水作业 UI 仪表板上看到的代码;

\n\n
PK\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...\n
Run Code Online (Sandbox Code Playgroud)\n\n

似乎胶水作业不接受 .zip 格式?如果是,那么我应该使用什么压缩格式?

\n\n

更新: \n我检查了粘合作业可以选择接受额外的文件,Referenced files path其中我提供了上述文件的所有路径的逗号分隔列表,并将 script_location 更改为仅引用main.py文件路径。但这也没有奏效。粘合作业抛出错误 no module found logger (我在 logger.py 文件中定义了这个模块)

\n

小智 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

  • 这是正确的。我提供了 script_location: `s3://&lt;bucket_name&gt;/etl_jobs/main.py` 和 `--extra-py-files s3://&lt;bucket_name&gt;/etl_jobs/my_etl_job.zip` 并且它有效。 (6认同)

Bjo*_*orn 8

我正在使用 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)