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

时间:2020-04-14 21:50:09

标签: python amazon-s3 aws-glue

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

my_etl_job
 |
 |--services
 |  |
 |  |-- __init__.py
 |  |-- dynamoDB_service.py
 |
 |-- __init__.py
 |-- main.py
 |-- logger.py

main.py是从上述目录中导入其他脚本的入口点脚本。在由开发端点创建的ETL群集上载后,以上代码在开发端点上运行良好。从现在开始,我要在生产中运行它,我想为其创建一个合适的胶水作业。但是,当我以my_etl_job格式压缩整个目录.zip时,将其上载到工件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文件中定义了该模块)

2 个答案:

答案 0 :(得分:1)

您必须将zip文件作为额外的python lib传递,或为代码包构建一个wheel软件包并将zip或wheel上载到s3,并提供与Extra python lib选项相同的路径

注意:将自己的主要功能自己写在胶水控制台中,从压缩/滚轮依赖性中引用所需的功能,您的脚本位置永远不应是zip文件

https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-python-libraries.html

答案 1 :(得分:1)

  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作为额外的文件添加到胶水中。 (您可以根据自己的喜好准备一个滚轮文件)