Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Automatize o carregamento em massa de dados do s3 para a instância Aurora MySQL RDS


A abordagem é conforme indicado acima, ter um gatilho de evento S3 e um trabalho lambda escutando no local do bucket/objeto do s3. Assim que um arquivo for carregado no local do s3, o trabalho lambda será executado e, no lambda, você poderá configurar para chamar um trabalho do AWS Glue. Isso é exatamente o que fizemos e foi ao vivo com sucesso. O Lambda tem uma vida útil de 15 minutos e deve levar menos de um minuto para acionar/iniciar um trabalho do Glue.

Por favor, encontre aqui uma fonte de amostra para referência.
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

Para criar uma função do Lambda, acesse AWS Lambdra->Create a new function from Scratch->Select S3 for event e, em seguida, configure os locais do bucket do S3, prefixos conforme necessário. Em seguida, copie e cole o exemplo de código acima, área de código embutido e configure o nome do trabalho de colagem conforme necessário. Verifique se você tem todas as funções/configuração de acesso do IAM necessárias.

O trabalho de colagem deve ter provisão para se conectar ao seu Aurora e, em seguida, você pode usar o comando "LOAD FROM S3....." fornecido pelo Aurora. Certifique-se de que todas as configurações/configurações do grupo de parâmetros sejam feitas conforme necessário.

Deixe-me saber se quaisquer problemas.

ATUALIZAÇÃO:snippet de código SAMPLE para LOAD FROM 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, [email protected];"
cur.execute(createStgTable1)
cur.execute(createStgTable2)
cur.execute(loadQry)
conn.commit()
conn.close()