首页 > 解决方案 > 在 AWS 中运行 Python ETL 代码的最佳选项

问题描述

我正在寻找关于使用哪种 AWS 服务(或其组合)在 Python 中执行 ETL 代码以转换基于文本的文件的建议:

代码/过程说明: 1. Python 代码将输入文本文件从自定义供应商格式转换为 CSV 格式。2. 单个 Python 代码调用转换单个文件,并且可以运行从一分钟到 10 分钟或更长的任何时间,因为输入文件的大小不同(从 KB 到 100 MB)。3. Python 代码需要在新的输入文件准备好后立即作为事件运行,这可以在一天中的任何时间发生多次。4. 我需要使用 AWS 无服务器选项,因此没有 EC2。

我目前的解决方案是使用 Lambda/S3 Event 来检测 S3 中新文件的创建,将其“移动”到同一 S3 存储桶中的相应文件夹并触发 AWS Glue Python Shell Job 对其进行转换。我相信 AWS EMR 对于正在转换的文件的大小来说是一种过度杀伤(

但是,我愿意接受更好的建议,因为到目前为止,AWS Glue 不像其他服务(如 Lambda)那样强大和成熟。如果我当前的解决方案看起来不错,无论如何请插话,这将帮助我确保我走在正确的道路上!

谢谢你,迈克尔:)

标签: python-3.xamazon-s3aws-lambdaaws-glueaws-batch

解决方案


我们可以在登陆文件夹上配置一个 Lambda S3 事件触发器,当文件上传时,我们可以在 Lambda 中有一个简短的脚本来触发 Glue 作业。胶水 python 脚本应该具有将输入文本文件转换为 CSV 文件所需的逻辑。这样,当文件上传到 S3 时,您的作业可以运行任意次数。

您的计费也仅在作业运行期间进行。请注意,由于其托管服务功能,Glue 的成本并不高。

创建事件触发器,触发粘合作业。请在此处找到 AWS Lambda 的代码片段:

from __future__ import print_function
import json
import boto3
import time
import sys
import time
from datetime import datetime

s3 = boto3.client('s3')
glue = boto3.client('glue')

def lambda_handler(event, context):
    gluejobname="<< THE GLUE JOB NAME >>"

    try:
        runId = glue.start_job_run(JobName=gluejobname)
        status = glue.get_job_run(JobName=gluejobname, RunId=runId['JobRunId'])
        print("Job Status : ", status['JobRun']['JobRunState'])
    except Exception as e:
        print(e)
        print('Error getting object {} from bucket {}. Make sure they exist '
              'and your bucket is in the same region as this '
              'function.'.format(source_bucket, source_bucket))
    raise e

推荐阅读