繁体   English   中英

如何为 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 集群后,上面的代码在开发端点上运行得很好。 因为现在我想在生产中运行它,所以我想为它创建一个合适的粘合作业。 但是,当我以.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
  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。 当你准备你的库时,只需 go 到 corelib 之前的文件夹和 zip 到如下文件夹

zip -r corelib.zip corelib/

然后,您可以将 crelib.zip 添加为 glue 中的额外文件。 (您可以根据自己的喜好准备一个轮文件)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM