Я относительно новичок в AWS, поэтому я не уверен, как это сделать,
У меня есть файлы CSV на s3, и я уже настроил экземпляр Aurora на RDS. Я не могу понять, как мне автоматизировать массовую загрузку данных, по сути, делая что-то вроде LOAD DATA FROM s3
, используя что-то вроде AWS Glue.
Я также использовал Glue, встроенный в s3 для RDS, но тогда это, по сути, набор вставок в RDS через соединение JDBC, которое также очень медленно для больших наборов данных.
Я могу сделать это самостоятельно, запустив команду в RDS, но я не хочу этого делать и хочу использовать Glue. Я также рассматривал возможность использования соединителя MySQL для Python, но Glue изначально поддерживает только Python 2.7, который я не хочу использовать.
Любая помощь будет принята с благодарностью.
Это то, что точно работает, но я не уверен, как мне автоматизировать все это, например, запустить задание Glue для выполнения ETL, а затем загрузить преобразованный CSV в RDS. Как мне сделать все это вместе в автоматическом режиме?
Рассмотрите возможность добавления триггера S3 при загрузке в корзину. Используйте это для вызова лямбда-функции, которая затем загружает данные в RDS.
Но разве у Lambda нет ограничения в 300 секунд для запуска всей функции? Кроме того, я не уверен, как написать Lambda, есть ли где-нибудь примеры?
Лямбды могут работать в течение 15 минут. В документации AWS есть много примеров. Мы не знаем, сколько данных вы перемещаете, как часто или какие-либо ваши требования, поэтому сложно предложить архитектуру. Почему вы не хотите использовать коннектор MySQL?
Ежедневно речь идет о концерте данных. Кроме того, о каком соединителе MySQL вы говорите, о том, который предоставляет Glue, или о соединителе Python? Я видел Python, но AWS изначально поддерживает только Python 2.7 через сервис Glue.
Подход такой же, как указано выше, имеет триггер события 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
, входит ли он в лямбда-код?
Манас, он должен быть в работе «Клей», так как у лямбды есть ограничение по времени. Наличие «загрузить данные из s3….» в AWS Glue позволяет лучше предположить, что в какой-то момент времени будет большой объем данных. Более того, Lambda не идеальна для ETL, а может использоваться в качестве службы оркестрации для запуска AWS Glue.
Я пробовал это с заданием Glue, но часть кода соединителя MySQL, которую вы загрузили выше, вызывает у меня проблемы с точки зрения использования внешней библиотеки в задании Glue. Из того, что я вижу, я могу использовать только библиотеки Python 2.7 с Glue, и это было частью вопроса, который я задал выше. Очень ценю всю вашу помощь в этом.
да, вам нужно использовать библиотеку pymysql в виде zip-файла и добавить к заданию клея.
Ох, ну ладно! Я как раз этим и занимался... Тем не менее, большое спасибо за помощь!!! Думаю, тогда это выход...
Рад, что это было полезно, и я чем-то помог. Спасибо. Мы используем ту же логику, и они успешно работают.
Загрузка данных напрямую из S3 в Aurora не соответствует вашим требованиям? docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/…