Antes de automatizar em alguma solução para CLOUD, eu preferi executar localmente todo o processo.
Assim deixei automatizado com Docker e Docker-compose.
Para fins de teste eu não adicionei um cluster Hadoop para ter um HDFS.
- Docker
- Docker-compose
No meu ambiente estou rodando com as seguintes versões
- Docker Version: 19.03.13
- Docker-compose
- docker-compose version 1.26.2, build eefe0d31
- docker-py version: 4.2.2
- CPython version: 3.7.7
- OpenSSL version: OpenSSL 1.1.0l 10 Sep 2019
- Porta do Cluster Spark UI: 8080
- URL do Cluster Spark para acesso dento da network criada pelo docker-compose: spark://spark:7077
- Porta do JupyterNotebook: 8888
Utilizando o comando docker-compose up
no diretório local_execution você terá acesso ao cluster spark e ao container rodando o jupyter notebook.
A url de acesso e o token estarão disponiveis no log do docker-compose.
Utilizando a opção devcontainer do VSCode o mesmo irá executar o docker-compose. Porém ele não irá executar o Jupyter Notebook devido o dockerfile estar usando a diretiva CMD ao inves do ENTRYPOINT.
Os laboratórios locais foram desenvolvidos utilizando os notebooks do jupyter.
Para executar o jupyter notebook no container basta executar o script:
bash entrypoint-jupyter.sh
No arquivo docker-compose.yml foram definidos três volumes de referencia no service python3.
- /config para o arquivo types_mapping.json que define o mapeamento de conversão de dados.
- /data para os arqivos do desafio ficarem isolados
- /workspace/project para ter uma visão do projeto como todo
Durante a execução local eu não iniciei um cluster Hadoop para ter hdfs para ser utilizado.
Na documentação é explicito que o path tem que ser uma estrutura que suporta Hadoop file system.
path – the path in any Hadoop supported file system
Devido a este fato eu uso o pandas para carregar o csv e apartir dele eu crio o objeto no pyspark.
Para salvar o arquivo eu estava fazendo o metodo de tranformar para um dataframe pandas e dele salvar no S.O. Porém neste metodo existe uma perda de informação na conversão dos dados para o timestamp. Como o meu objetivo é a execução em Cloud, vou deixar este TODO neste projeto.