在 AWS 中运行 Python ETL 代码的最佳选项

Posted

技术标签:

【中文标题】在 AWS 中运行 Python ETL 代码的最佳选项【英文标题】:Best Option(s) for Running Python ETL Code in AWS 【发布时间】:2020-06-17 03:06:30 【问题描述】:

我正在寻找有关使用哪种 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)那样强大和成熟。 如果我当前的解决方案看起来不错,无论如何请插话,这将帮助我确保我走在正确的道路上!

谢谢, 迈克尔:)

【问题讨论】:

您也可以在 Lambda 中进行处理:从 S3 流式传输,或保存到 /tmp 。您可以编写自己的 SerDe 来读取输入文件,并使用 Athena 将其保存为 CSV 感谢尼尔的回答!你能提供更多细节吗? 1. 除了已经提供的以外,Athena 不支持自定义 SerDe:aws.amazon.com/athena/faqs 所以,我无法编写自己的 SerDe 来读取自定义格式的文件。 2. SerDe 将在哪里运行?在哪个服务?正如我上面提到的,我不能完全在 Lambda 函数中运行 ETL 代码。对任何混淆表示歉意。我希望你能进一步澄清。 哦,你是对的,没有自定义 serdes。 【参考方案1】:

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

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

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

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

【讨论】:

以上是关于在 AWS 中运行 Python ETL 代码的最佳选项的主要内容,如果未能解决你的问题,请参考以下文章

将 AWS Glue Python 与 NumPy 和 Pandas Python 包一起使用

Python/Pyspark 迭代代码(用于 AWS Glue ETL 作业)

AWS Glue ETL 作业中的 Boto3 Glue

从 AWS Redshift 到 S3 的 AWS Glue ETL 作业失败

AWS Glue ETL作业缺少对爬网程序可见的字段

运行 AWS 胶水工作室 ETL 脚本时出现 ARN 角色授权错误