O blog da AWS

Fazendo a ingestão de dados de bases relacionais para o Data Lake na AWS com Blueprints do Lake Formation

Por Hugo Rozestraten, Arquiteto de Soluções especializado em Analytics na AWS

 

As empresas utilizam cada vez mais dados para a tomada de decisão, e uma das principais fontes de dados são as bases de dados relacionais. Estas podem conter, por exemplo, transações de negócios, dados de vendas, fabricação, movimentações de estoque, transações bancárias, entre outros. Estas informações transacionais, quando consolidadas e analisadas ao longo do tempo, indicam tendências, apontam necessidades de mudanças e, principalmente, servem para a tomada de decisões.

Para atender esta necessidade, utilizamos uma estrutura de Data Lake, que serve para que as empresas armazenem e utilizem dados de qualquer fonte que possuam (CRMs, ERPs, Sites, Aplicativos móveis, dispositivos móveis, etc.) no volume que necessitarem, na velocidade que os dados sejam gerados, e de forma que esses dados sejam acessíveis para realizar análises exploratórias importantes para o negócio.

Neste blog, vamos explorar como trazer dados das bases relacionais para o Data Lake de maneira simples, com carga inicial e incremental.

 

Lake Formation e Blueprints

O AWS Lake Formation é o serviço da AWS que centraliza e facilita a configuração de um Data Lake seguro, de forma rápida e organizada. O serviço ajuda você a coletar e catalogar os dados de bancos de dados e de armazenamento de objetos, mover os dados para o novo Data Lake do Amazon S3, limpar e classificar os dados usando algoritmos de Machine Learning e proteger o acesso aos dados confidenciais.

O serviço do Lake Formation deixa você criar workflows a partir de um blueprint (template automatizado), criar workflows de carga de dados de forma simples e rápida. Estes podem ser de 3 tipos:

Database snapshot – Carrega ou recarrega dados de tabelas no data lake utilizando uma conexão JDBC a um banco de dados. Você pode carregar todas as tabelas ou excluir algumas baseado em padrões de exclusão.

Incremental database – Carrega somente o dado novo no data lake, a partir de uma conexão JDBC a um banco de dados, baseado no conceito de bookmarks (ou ponteiros). Você especifica tabelas individuais para incluir, e para cada uma delas define uma coluna para ser o bookmark e a ordenação de carga da mesma, para saber o que já foi carregado e o que precisa ser carregado no data lake.  Após a primeira carga incremental, o workflow carrega as tabelas, e então estabelece e armazena o bookmark de cada uma delas. Dessa forma, você pode utilizar a carga incremental inclusive para realizar a primeira carga completa.

 

Carregando seus dados para o Data lake

Vamos realizar a criação de um banco de dados, e carregar alguns dados nele à partir de uma máquina virtual usando o AWS Cloud9.

Pré-requisitos:

  1. Em uma conta da AWS selecione uma região para realizar a carga de dados. Se você não tem uma conta ainda, pode criá-la aqui.
  2. Para facilitar as instruções, selecione a linguagem como Inglês na console. Para isso, desça até o final da página, e na opção de linguagem, ao lado de feedback, selecione English (US).

 

 

Criação do ambiente com CloudFormation

1. Para realizar a criação de um ambiente com um Banco de Dados e uma instância para acesso:

a. Clique em um dos links abaixo para lançar um CloudFormation diretamente na região escolhida.

Região AWS escolhida Link para criação
N.Virginia (us-east-1)
Ohio (us-east-2)
Oregon (us-west-2)
South America (sa-east-1)

 

b. Ou copie e passe a seguinte URL para lançar em outras regiões na criação do CloudFormation. Se optou pelo passo (a), pule este passo.

https://s3.amazonaws.com/ee-assets-prod-us-east-1/modules/07b3ebc0d5e54945bcf1988e58530272/v1/cfn-master-blueprint.template

           Vá para Cloudformation -> Create stack, e na Amazon S3 URL cole a URL acima:

 

 

c. Em Stack name, coloque “labdb” e clique em Next.

 

 

d. Desça até o final da página seguinte, e novamente clique em Next.

 

 

e. Desça ao final da página seguinte, marque as opções de criação de recursos de IAM e CAPABILITY_AUTO_EXPAND, e clique em Create stack.

 

 

2. A criação acima vai levar cerca de 15 minutos, e vai criar uma “stack nested” com nome iniciado por “lab-VpcStack-”.

 

 

Assim que terminar a criação da stack “lab-VpcStack-”, siga para o passo seguinte.

Configuração do AWS Cloud9

1. Vá para seu ambiente de AWS Cloud9:

a. Navegue para Services -> Cloud9.

 

 

b. Clique em “Open IDE” .

 

 

c. Agora você tem acesso ao bash no ambiente do Cloud9:

 

 

2. Setup do Security Group:

a. Verifique se já existe um Security Group (SG) criado pelo CloudFormation, que é o firewall para seu banco de dados chamado “lab-blueprint-Db-Inbound”:

Bash
aws ec2 describe-security-groups | grep lab-blueprint-Db-Inbound

 

 

Se o comando retornar como a figura indica, o Security Group já existe, então siga para o próximo comando. Se não retornar nenhuma linha, aguarde mais alguns minutos para a criação do mesmo pelo CloudFormation.

b. Setup de variáveis baseadas em outputs de comandos CLI:

Bash

vpcid=`aws ec2 describe-vpcs --filters Name=tag:Name,Values=labdb | grep VpcId | awk '{print $2}' | sed s/\"//g | sed s/,//g`

group=`aws ec2 describe-security-groups | grep cloud9 | grep GroupName | awk '{print $2}' | sed s/\"//g | sed s/,//g`

source=`aws ec2 describe-security-groups --filters Name=group-name,Values=$group | grep GroupId | head -1 | awk '{print $2}' | sed s/\"//g | sed s/,//g`

target=`aws ec2 describe-security-groups --filters Name=group-name,Values=lab-blueprint-Db-Inbound | grep GroupId | head -1 | awk '{print $2}' | sed s/\"//g | sed s/,//g`

aws ec2 authorize-security-group-ingress \
    --group-id $target \
    --protocol tcp \
    --port 3306 \
    --source-group $source

 

 

c. Ainda no seu ambiente de AWS Cloud9, copie dois arquivos python para geração de dados e instale pymysql, executando os comandos no bash:

Bash

sudo pip install pymysql

wget https://s3.amazonaws.com/ee-assets-prod-us-east-1/modules/07b3ebc0d5e54945bcf1988e58530272/v1/app.py

wget https://s3.amazonaws.com/ee-assets-prod-us-east-1/modules/07b3ebc0d5e54945bcf1988e58530272/v1/rds_config.py

 

 

Criação de Dados

1. Vá para a console do RDS, para encontrar o endpoint do seu banco de dados:

a. Navegue até Services -> RDS:

 

 

b. Na aba da esquerda clique em Databases, e então clique no cluster criado iniciando com “labd-db-aurora”:

 

 

c. Copie o Endpoint name de Writer:

 

 

2. Conecte a partir do Cloud9.

a. Abra o arquivo rds_config.py pelo Cloud9 e edite o campo de endpoint com o endpoint copiado do RDS:

 

 

b. Clique em File, e depois em Save para salvar.

c. Crie a tabela e três registros com o programa py:

Bash

python app.py create

 

 

Criação do Blueprint no Lake formation.

1. Conexão no Glue.a.

a. Vá para a console do Glue, e clique em Databases -> Connections, e depois em Add connection.

 

 

b. Preencha as propriedades:

      • Connection name: lab
      • Connection type: Amazon RDS
      • Database engine: Amazon Aurora

c. Clique em Next.

 

 

d. Preencha as dados de acesso:

      • Instance: labdb1
      • labdb: labdb
      • Username: labuser
      • Password: (senha) – Se esta não foi alterada durante o setup do CloudFormation, é Tim3t0change.

e. Clique em Next.

 

 

f. Clique em Finish.

 

 

g. Teste a conexão, clicando nela e depois em Test connection.

 

 

h. Selecione a role Glue-labdb-role e Test connection.

 

 

i. Após aproximadamente 1 minuto você verá a conexão com sucesso.

 

 

2. Setup do Lake Formation.

a. Vá para a console do Lake Formation, e clique em Get started.

 

 

b. Clique em Add administrator.

 

 

c. Escolha seu usuário ou a role que estiver usando como Administrador do Lake Formation, você pode verificar o usuário ou role que está usando na parte superior da Console bem ao lado da região, no formato “user ou role @ conta”.

d. Clique em Save.

 

 

e. No menu à esquerda, selecione Data Lake locations e depois clique em Register location.

 

 

f. Em Amazon S3 path clique em Browse:

 

 

g. Selecione o bucket que inicia com ’00-labdb’ e termina com ‘-raw’.

 

 

h. Clique em Register location.

3. Usando Blueprint.

a. Vá para a console do Glue.

b. Clique em Databases no menu à esquerda e selecione “Add database”, digite o nome sampledb, e clique em “create”:

 

 

c. Volte para a console do Lake Formation.

d. Em Databases, selecione sampledb -> Action -> Grant.

Conceda o grant abaixo à role Glue-labdb-role.

e. Em Database permissions, selecione Create table, Alter, Drop e Super.

f. Clique em Grant.

 

 

g. No menu à esquerda, clique em Permissions -> data locations, e clique em

Conceda o grant abaixo à role Glue-labdb-role.

 

 

h. Na console do Lake Formation, vá para Blueprints e clique em Use blueprint.

i. Selecione Incremental database, para realizar uma carga inicial e cargas incrementais baseadas em uma chave da tabela.

 

 

j. Em Import source, selecione:

      • Database connection: lab
      • Source data path: labdb/%

k. Em Incremental Data, preencha as propriedades:

      • Table name: employee (somente minúsculas)
      • Bookmark Keys: empid (somente minúsculas)
      • Bookmark order: Ascending

 

 

l. Em Import target, selecione:

      • sampledb como Target database
      • Seu bucket raw como Target storage location.

 

 

      • Data format como “Parquet”.

 

 

m. Em Import frequency, selecione:

      • Frequency: Custom
      • Cron expression: 0/20 * * * ? *
        (a cada 20 minutos )

n. Em Import options, preencha as propriedades:

      • Workflow name: labworkflow
      • IAM role: Glue-labdb-role
      • Table prefix: lab

o. Clique em Create.

 

 

4. Acompanhando seu Workflow.

a. Após criar o Blueprint, este vai gerar um Workflow. Caso apareça “Start it now?”, clique para iniciar. Caso o mesmo não apareça, vá em Actions -> Start.

 

 

b. Após iniciar, abra o link de “labworkflow”.

c. Vai aparecer pelo menos um Run ID, clique nele.

 

 

d. São criados vários passos com Jobs, desde o mapeamento da sua fonte, até a carga e transformação dos arquivos em formato Parquet. Clique em View run details para acompanhar a execução do workflow:

 

 

e. É possível verificar o histórico de cada execução do Workflow.

 

 

5. Consulte o dado no Data Lake.

a. Após a execução do Workflow, vá para a console do Amazon Athena.

 

 

b. Clique em Get Started. Caso apareça a mensagem abaixo, clique em ‘set up a query result location in Amazon S3’.

 

 

c. Preencha o Query result location com e clique Save:}
s3://<nome seu bucket>/athena-results/

 

 

d. Realize uma query no Athena:

      • SQL
        SELECT * FROM "sampledb"."lab_labdb_employee";

 

 

6. Gere dados incrementais.

a. Vá até a console do Cloud9 e execute o seguinte comando 2 vezes para gerar novos dados:

Bash

python app.py add

 

 

b. Volte ao Workflow na console do Lake Formation, na seção de Blueprints, e se não houver execução corrente no momento, inicie uma execução clicando em Actions -> Start.

 

 

c. Caso já esteja em execução pelo Schedule, aguarde o término.

d. Volte ao Amazon Athena e realize novamente a query no editor:

      • SQL
SELECT * FROM "sampledb"."lab_labdb_employee";

 

 

Resumo

Neste post, descrevemos como utilizar o serviço de Blueprints do AWS Lake Formation, que facilita a ingestão de dados de bases de dados ou logs para o Data Lake, criando um Workflow completo para trazer os dados e catalogá-los.

Da ingestão ao consumo de dados, você encontra neste post uma maneira fácil de trazer dados de bases de dados relacionais para seu Data Lake na AWS e realizar permissionamento e consultas SQL sobre os dados.

 Faça mais com Data Lakes na AWS:
Siga nossa série de blog posts sobre Data Lake para saber como criar e extrair valor do seu data lake na AWS.

 


Sobre o autor

Hugo Rozestraten é Arquiteto de Soluções especializado em Analytics na AWS.

 

 

 

 

Explore os tipos de banco de dados disponíveis, as diferenças entre os serviços de banco de dados gerenciados padrão e os bancos de dados nativos da nuvem através do data flywheel