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/
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:
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!