Skip to main content

Introdução

Nesse  projeto vamos  utilizar  algumas ferramentas para  capturar  dados de  uma  API da bolsa de valores, enviá-los para nuvem da Amazon e em seguida ler esses dados com o Python.

Utilizaremos  o Docker  para  criar os  ambientes  necessários e  assim  facilitar a instalação  e desinstalação pósprojeto, vamos utilizar o Nifi para buscar os dados na API e trafegá-los até oS3. Para saber quais dados buscar, utilizaremos o Postgres como fonte deda678o9pdos.

Ferramentas utilizadas no projeto:

•Docker

•Apache Nifi

•Postgres SQL

•Amazon Web ServicesS3

•Jupyter

Experimentos e Resultados

Docker

Para iniciar o projeto, vamos precisar configurar os containers do Nifi e Postgres SQL.

Seguir o passo a passo:

1. Crie um diretório chamado “projeto_b3” e  dentro  dele um arquivo de texto com o conteúdo aolado:

2. Salve o arquivo como docker-compose.yaml.

3.No terminal:

a. Abra o diretório que acabamos de criar: cd </path/dir>

b. Para instalar os containers: docker-compose up -d

c.Aguarde  alguns minutos  e  tente acessar  o  caminho: http://localhost:8080/nifi/

Caso não tenha êxito nos passos anteriores será necessário analisar o log na execução do container.

API Bolsa de valores

Agora vamos obter os acessos necessário para extrair dados da bolsa de valores, a própria B3 disponibiliza uma API paga, entretanto como o intuito desse artigo é apenas acadêmico, vamos utilizar uma API gratuita.

Acesse o site https://www.alphavantage.co/

Engenhearia de Dados com Nifi

Clique na opção ‘GET YOUR FREE API KEY TODAY’, preencha as informações solicitadas e anote a key que foi criada:

Para  saber quais  informações  conseguimos extrair  e  como  extrair,  acessar a  documentação: https://www.alphavantage.co/support/#api-key

Postgres SQL

Após  chegar aqui,  precisaremos mapear  quais informações  vamos  buscar na  API,  para isso utilizaremos o banco de dados Postgres SQL.

Acesse o painel do Docker e verifique se nosso container está em execução

Como pode ver ele está em execução, agora abra o terminal e vamos criar nossa tabela com os dados que vamos buscar:

1.Abra o terminal

2.Entre no container do postgres:docker exec -it postgres-pipeline bash

3. Dentro do container, digite: ‘psql -U postgres’, para acessar o postgres

4. Agora vamos criar nosso database: ‘CREATE DATABASE projeto_b3;’

5. Conecte ao database: \c projeto_b3;

6. Crie a tabela para armazenar as informações que vamos buscar: ‘create table get_api(ativo varchar, intervalo varchar);’

7. E insira as informações que deseja buscar na API, no nosso exemplo vamos inserir apenas 2 registros:

1.’insert into get_apivalues (‘IBOV’,’5min’);’

2.’insert into get_apivalues (‘IBM’,’5min’);’

8. Aperte CTRL + d para sair do postgres.

Amazon AWS S3

Crie uma conta na Amazon e verifique as opções das maquinas free tier, assim você não terá um custo para esse curso.

Vamos para o passo a passo:

1. Entre na sua conta da Amazon

2. Vá em serviços e localiza o S3, e acesse.

3.Após isso você deve ver a imagem abaixo, clique em Criar Bucket:

engenharia de dados com nifi

1. Nome do bucket: é um nome único,muito cuidado com esse nome, pois é único no     mundo    inteiro,     no     projeto    vou     colocar     o    seguinte     nome: ‘mybucketcapturedatab3byleo’

2.Região  da AWS: nessa  opção  vou escolher  Norte  da Virginia por ser  uma das regiões mais baratas e por estar incluso no pacote free tier.

iv. Na aba de permissões clique em criar grupo

v.Defina um nome para o grupo e escolha a permissão “AmazonS3FullAccess”, e clique em criar grupo

Alguns dados serão gerados, conforme imagem abaixo, guarde sua id de acesso e a chave secreta, pois são os acesso sque utilizaremos no Nifi

Pronto agora, seu usuário e seu bucket estão devidamente configurados.

Nifi

Antes de acessar a interface do Nifi e começarmos a criar os pipelines, vamos configurar o drive do postgres dentro da máquina do Nifi.

1. Acesse o container do Nifi, no terminal digite: ‘docker exec -it nifi bash’

2.Para  garantirmos que  não  teremos nenhum  problema  por conta  de  atualizações do container, execute os comandos:

a. apt-get update

b. apt-get upgrade

3. Agora vamos precisar instalar o wget para baixar o jar do drive.

a. apt-getinstall wget

4.Após instalar  acesse  o  site PostgreSQL JDBC  Download,  e baixe  a  versão compatível com o Nifi, caso esteja na última versão e só pegar a mais recente.

a. Acesse a pasta: cd /data/

b.E   baixe  o   arquivo:   wget https://jdbc.postgresql.org/download/postgresql-42.3.1.jar

Já instalamos  o  drive,então vamos  para interface  do Nifi,  entre em  seu  navegador e  acesse http://localhost:8080/nifi/

Crie um process Group chamado “Project_b3”:

Entre nesse grupo e crie mais um chamado “Extração”

Agora vamos  estruturar  nossa camada  de  extração dos  dados,  crie todos  os  pipelines conforme a imagem abaixo e depois vamos configurá-los:

1. Execute SQL

a. É nessa etapa que configuramos  o acesso ao  postgres, em “SQL select query”,coloque a query para consultar a tabela que criamos no postgres:

b.Em“Database Connection Pooling Service” crie um novo  serviço, conforme configurações abaixo:

c.Acesse o Controller  Services,  e entre  nas  configurações do  controlador que acabamos

d. Agora vamos inserir as configurações necessárias de conexão com o postgres:

i.Database Connection URL:jdbc:postgresql://postgres-pipeline:5432/projeto_b3

ii. Database Driver ClassName:org.postgresql.Driver

iii. DatabaseDriver Location(s):Esse é o local onde colocamos o drive do postgres -/data/postgresql-42.3.1.jar

iv. Databaseuser:postgres

v. Password:Postgres2020!–essa  senha  é configurada  na  criação do container.

e. Digite ok e ative o controlador

f. Agora clique no centro do processor que acabamos de criar, vamos segurar, mover para fora do processor e jogar dentro do processor novamente, para assim criarmos o loop de falha – caso alguma query apresente falha, ele vai para essa fila e tenta novamente.

g.Selecione a opção failure e aperte ok!

2. Convert Avro To Json

a. Os dados que recebemos do postgres vem no formato Avro, vamos converter para Json,assim facilita a manipulação.

3. Split Json

a. Essa parte separa registro por registro do Json, assim conseguimos fazer a leitura da API sem problemas

4. Evaluate Json Path

a. Processor  responsável por capturar os atributo se armazana-los em algumas variáveis, para compor o link da API, no nosso caso vamos criar duas variáveis, “ativo” e “intervalo”,conforme abaixo:

5.InvokeHTTP

a. É nesse processor que fazer a chamada na API,copiar o link abaixo e colocar no“Remote URL”, acrescentar a sua API KEY que geramos quando fizemos o cadastro do alpha vantage.

i.https://www.alphavantage.co/query?function=TIME_SERIES_INTRADAY&symbol=${ativo}&outputsize=compact&interval=${intervalo}&apikey={apikey}

6. Update Attribute

a.Para mapearmos os arquivos no S3 é interessante renomea-los, para isso vamos utilizar o processor UpdateAttribute:

i.Vamos alterar o file name para o nome do ativo,seguido da data e hora atual:${ativo}_${now():toNumber():format(“yyyyMMddHHmmssSSS”)}.json

7. Put S3 Object

a.Agora que já estamos capturando os dados, precisamosarmazena-lo no s3, para isso vamos utilizar o processor chamado “PutS3Object”.

i.Object Key:  é o  nome do  seu objeto  dentro do  S3,  normalmente deixamos com o nome do arquivo,ou quando temos muitos dados, criamos pastas la dentro.

ii.Bucket: o nome do Bucketque criamos no s3

iii.Access Key ID: a ID de acesso que geramos na AWS.

iv.Secret Access Key: a chave secreta que geramos naAWS.

v.Region: Região onde configurou o bucket.

Agora que finalizamos todo o fluxo, inicie processo aprocesso, e entenda cada valor queesta sendo gerado, é possivel configurar osprocessors para rodar de tempo em tempo,de acordo com a sua necessidade, paraisso clique nos conectores e altere as configurações.

Com  os  dados no S3, eles estão prontos para seremanálisados, aqui  no projeto vamosutilizar o python para ler o arquivo json que armazenamosno bucket, mas existem diversas formas de buscar esse dado, inclusiveferramentas da propria Amazon.

Acesse o bucket para validar que os arquivos realmenteforam enviados:

Após validar o arquivo, abre a IDE Python, e vamoscomeçar a brincar com o arquivo.

Python

Abre o terminal do python e instale asbibliotecasboto3 eawscli:

•pip install boto3

•pip install awscli

Agora precisamos cadastrar a nossa chave, no terminaldigite “aws configure”e coloque as informações da ID de acesso e da chavesecreta.

1. AWS Access Key ID[None]: xxxxx

2. AWS Secret AccessKey [None]: xxxxx

3.Default region name[None]: us-east-1

4.Default outputformat [None]: json

Depois de cadastrar, liste os usuarios ativos, deveaparecer o final do seu ID deacesso:

Agora acesseo python, e rode o script abaixo, deve aparecer obucket que criou no S3:

Para listar os objetos que subimos, utilize:

Para baixar o arquivo e ler com pandas:

Dessa forma podemos baixar e ler o arquivo sem problemas nenhum, e temos um fluxo funcionando de ponta a ponta, com o arquivo no S3 e com a conexão habilitada no python, agora depende do que a pessoa deseja fazer com o arquivo para os próximos passos.

Caso deseje utilizar mais funções do boto 3, é interessante acessar a página da documentação:S3 —Boto3 Docs 1.20.23documentation (amazonaws.com)

Conclusões

Nesse projeto podemos aprender como buscar os dados em uma API de maneira simples e armazená-loem uma nuvem, esse projeto pode ser melhorado para tratar inconsistências vindas da API, podemos criar processos agendados no AWS com  algumas ferramentas, e também podemos  utilizar o Kafka  para  tornar essa aplicação mais escalável, entretanto, para o que precisamos no projeto o arquitetura que desenvolvemos atende. Para trabalhar com os dados no Python, com um maior volume,  acredito que utilizar o py spark seja uma opção melhor que  o Pandas.

‍Gostou do artigo? Veja outros conteúdos do Semantix Lab e continue aprendendo conosco!

Leave a Reply