如何为 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

  1. 你的主要工作不应该被压缩。那应该是一个py文件本身。在这种情况下,这就是你 main.py。这不应该是 zip 文件的一部分。
  2. 您在代码中引用的任何其他库文件都可以压缩或制作为 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