Автоматизируйте массовую загрузку данных из s3 в экземпляр Aurora MySQL RDS

Я относительно новичок в AWS, поэтому я не уверен, как это сделать,

У меня есть файлы CSV на s3, и я уже настроил экземпляр Aurora на RDS. Я не могу понять, как мне автоматизировать массовую загрузку данных, по сути, делая что-то вроде LOAD DATA FROM s3, используя что-то вроде AWS Glue.

Я также использовал Glue, встроенный в s3 для RDS, но тогда это, по сути, набор вставок в RDS через соединение JDBC, которое также очень медленно для больших наборов данных.

Я могу сделать это самостоятельно, запустив команду в RDS, но я не хочу этого делать и хочу использовать Glue. Я также рассматривал возможность использования соединителя MySQL для Python, но Glue изначально поддерживает только Python 2.7, который я не хочу использовать.

Любая помощь будет принята с благодарностью.

Загрузка данных напрямую из S3 в Aurora не соответствует вашим требованиям? docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/…

bwest 11.04.2019 04:36

Это то, что точно работает, но я не уверен, как мне автоматизировать все это, например, запустить задание Glue для выполнения ETL, а затем загрузить преобразованный CSV в RDS. Как мне сделать все это вместе в автоматическом режиме?

Manas Jani 11.04.2019 15:07

Рассмотрите возможность добавления триггера S3 при загрузке в корзину. Используйте это для вызова лямбда-функции, которая затем загружает данные в RDS.

bwest 11.04.2019 15:15

Но разве у Lambda нет ограничения в 300 секунд для запуска всей функции? Кроме того, я не уверен, как написать Lambda, есть ли где-нибудь примеры?

Manas Jani 11.04.2019 15:16

Лямбды могут работать в течение 15 минут. В документации AWS есть много примеров. Мы не знаем, сколько данных вы перемещаете, как часто или какие-либо ваши требования, поэтому сложно предложить архитектуру. Почему вы не хотите использовать коннектор MySQL?

bwest 11.04.2019 15:35

Ежедневно речь идет о концерте данных. Кроме того, о каком соединителе MySQL вы говорите, о том, который предоставляет Glue, или о соединителе Python? Я видел Python, но AWS изначально поддерживает только Python 2.7 через сервис Glue.

Manas Jani 11.04.2019 16:20
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
6
4 605
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Подход такой же, как указано выше, имеет триггер события S3 и лямбда-задачу, прослушивающую местоположение корзины/объекта s3. Как только файл будет загружен в папку s3, запустится лямбда-задание, и в лямбда-выражении можно настроить вызов задания AWS Glue. Это именно то, что мы сделали и успешно пошли в прямом эфире. У Lambda есть 15-минутная жизнь, и для запуска/запуска задания Glue требуется меньше минуты.

Пожалуйста, найдите здесь пример источника для справки.

from __future__ import print_function
import json
import boto3
import time
import urllib

print('Loading function')

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

def lambda_handler(event, context):
    gluejobname = "your-glue-job-name here"

    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

Для создания функции Lambda перейдите в AWS Lambdra->Создать новую функцию из Scratch->Выберите S3 для события, а затем настройте расположение корзин S3 и префиксы по мере необходимости. Затем скопируйте и вставьте приведенный выше пример кода, область встроенного кода и при необходимости настройте имя задания склеивания. Убедитесь, что у вас есть все необходимые настройки IAM-ролей/доступа.

В клеевом задании должно быть предусмотрено подключение к Aurora, а затем вы можете использовать команду «LOAD FROM S3…», предоставленную Aurora. Убедитесь, что все настройки/конфигурации группы параметров выполнены надлежащим образом.

Дайте мне знать, если возникнут проблемы.

ОБНОВЛЕНИЕ: ОБРАЗЕЦ кода для ЗАГРУЗКИ ИЗ S3:

conn = mysql.connector.connect(host=url, user=uname, password=pwd, database=dbase)
cur = conn.cursor()
cur, conn = connect()
createStgTable1 = "DROP TABLE IF EXISTS mydb.STG_TABLE;"
createStgTable2 = "CREATE TABLE mydb.STG_TABLE(COL1 VARCHAR(50) NOT NULL, COL2 VARCHAR(50), COL3 VARCHAR(50), COL4 CHAR(1) NOT NULL);"
loadQry = "LOAD DATA FROM S3 PREFIX 's3://<bucketname>/folder' REPLACE INTO TABLE mydb.STG_TABLE FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n' IGNORE 1 LINES (@var1, @var2, @var3, @var4) SET col1= @var1, col2= @var2, col3= @var3, col4=@var4;"
cur.execute(createStgTable1)
cur.execute(createStgTable2)
cur.execute(loadQry)
conn.commit()
conn.close()

Спасибо за это, но я уже позаботился о лямбда-функции. Где мне написать оператор LOAD DATA FROM s3, входит ли он в лямбда-код?

Manas Jani 15.04.2019 14:46

Манас, он должен быть в работе «Клей», так как у лямбды есть ограничение по времени. Наличие «загрузить данные из s3….» в AWS Glue позволяет лучше предположить, что в какой-то момент времени будет большой объем данных. Более того, Lambda не идеальна для ETL, а может использоваться в качестве службы оркестрации для запуска AWS Glue.

Yuva 15.04.2019 15:14

Я пробовал это с заданием Glue, но часть кода соединителя MySQL, которую вы загрузили выше, вызывает у меня проблемы с точки зрения использования внешней библиотеки в задании Glue. Из того, что я вижу, я могу использовать только библиотеки Python 2.7 с Glue, и это было частью вопроса, который я задал выше. Очень ценю всю вашу помощь в этом.

Manas Jani 15.04.2019 17:11

да, вам нужно использовать библиотеку pymysql в виде zip-файла и добавить к заданию клея.

Yuva 15.04.2019 17:28

Ох, ну ладно! Я как раз этим и занимался... Тем не менее, большое спасибо за помощь!!! Думаю, тогда это выход...

Manas Jani 15.04.2019 17:43

Рад, что это было полезно, и я чем-то помог. Спасибо. Мы используем ту же логику, и они успешно работают.

Yuva 15.04.2019 17:54

Другие вопросы по теме