python-3.x - 在 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)那样强大和成熟。如果我当前的解决方案看起来不错,无论如何请插话,这将帮助我确保我走在正确的道路上!
谢谢你,迈克尔:)
解决方案
我们可以在登陆文件夹上配置一个 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
推荐阅读
- python - 绘制n个限制Python
- python - Python-Docx 将表格导出到 Word 表格
- keras - 深度学习 NLP:“高效”的类似 BERT 的实现?
- python - 如何在类中定义只能从 __init__ 方法调用的方法
- python - 如何编写python代码以将输入屏蔽为输出中的*
- python - Windows 上的 pip install django 无法下载
- java - JavaFX ImageCursor 损坏且无法正确显示
- sql - 在 Bigquery 中有效地取消嵌套值?(选择/案例/其他?)
- kubernetes-dashboard - kubernetes 从 1.17.5 升级到 1.18.0 后,没有可用于服务“kubernetes-dashboard”的端点
- javascript - 在 Javascript 上导入组件是否每次导入都需要新资源?