Лучший вариант (ы) для запуска Python ETL-код в AWS - PullRequest
0 голосов
/ 04 марта 2020

Я ищу рекомендацию, какую службу AWS (или их комбинацию) использовать для выполнения кода ETL в Python для преобразования текстовых файлов:

Описание кода / процесса : 1. Python код преобразует входные текстовые файлы из пользовательского формата поставщика в формат CSV. 2. Однократный вызов кода Python преобразует один файл и может выполняться от минуты до 10 минут и более, поскольку размеры входных файлов различаются (от КБ до 100 с МБ). 3. Python код должен запускаться как событие, как только новый входной файл готов, что может произойти в любое время, несколько раз в день. 4. Мне нужно использовать AWS опции без сервера, следовательно, нет EC2.

Мое текущее решение - использовать Lambda / S3 Event, чтобы обнаружить создание новых файлов в S3, «переместить» его в соответствующий папку в том же ведре S3 и триггер AWS клей Python Shell Job для его преобразования. Я считаю, что AWS EMR является излишним для размеров преобразуемых файлов (

Однако я открыт для более качественных рекомендаций, поскольку AWS Glue пока не выглядит таким же надежным и зрелым, как другие сервисы ( как лямбда). Если моё текущее решение кажется здравым, пожалуйста, перезвоните в любом случае, это поможет мне убедиться, что я на правильном пути!

Спасибо, Майкл:)

1 Ответ

1 голос
/ 05 марта 2020

Мы можем настроить триггер событий Lambda S3 в целевой папке, и когда файл загружен, у нас может быть краткий скрипт в Lambda для запуска задания Glue. Скрипт glue python должен иметь logi c для преобразования входных текстовых файлов в файлы 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...