Esse projeto é altamente inspirado na arquitetura mostrada pelo @carlosbpy no Bootcamp Engenheiro de Dados Cloud do IGTI
1.1 Suba um banco Postgres no seu cloud provider favorito e permita que ele possa ser acessado de qualquer lugar. Na AWS basta criar novas inboud rules no security group do seu banco.
1.2. Conecte no seu banco e execute o SQL contido no arquivo schema.sql
2.1. Crie um arquivo chamado .env
na pasta api/
2.2. No seu .env coloque as informações do banco, por exemplo:
2.3. Execute o arquivo insert_customers_postgres.py, que é o responsável por gerar nossos dados e inseri-los no banco, por exemplo:
$ python3 insert_customers_postgres.py -n 100 --silent true
2.4. Confira se os dados chegaram no banco.
3.1. Customize o arquivo create-eks.sh e o execute para subir um cluster kubernetes no AWS EKS.
3.2. Com o cluster up, crie os namespaces ingestion, processing e datastorage.
4.1. Para não ter que passar o namespace em todo comando executado pelo kubectl usarei o kubens para deixar o ingestion como namespace padrão:
$ kubens ingestion
4.2. Execute o script install-strimzi-helm.sh
4.3. Confira se o operator está disponível:
$ helm ls
$ k get pods
$ k get all
5.1. Para subir o Kafka Brooker usando o Strimzi, customize o arquivo broker.yml e em seguida aplique seu manifesto:
$ k apply -f kafka-strimzi-k8s-v1beta1/kafka-brokers-cluster/broker.yml
5.2. Confira se o Brooker está disponível:
$ k get pods
$ k get kafkatopics
6.1. Antes de subir o cluster de Kafka Connect precisamos customizar a imagem Docker para que ela tenha os JARs de connectors que precisamos.
6.2. Primeiro precisamos customizar o arquivo create-ecr-repository.sh mudando o nome do profile e do repositório. Esse repositório será seu hub privado de imagens Docker.
6.3. Uma vez que o repositório foi criado será possível acessá-lo pelo console da AWS. No canto superior direito da página do repositório existe um botão com instruções de como subir uma imagem para ele, copie e cole os comandos ou customize o arquivo build-and-push-img-strimzi.sh e o execute.
6.4. Coloque o URI da sua imagem do ECR no campo spec.image do arquivo connect.yml
6.5. Para subir o cluster de Kafka Connect usando o Strimzi, customize o arquivo connect.yml e em seguida aplique seu manifesto:
$ k apply -f kafka-strimzi-k8s-v1beta1/kafka-connect-cluster/connect.yml
6.6. Confira se o Cluster está disponível:
$ k get pods
7.1. No arquivo ingest-src-postgres-customers-json.yml, customize os campos:
metadata.name
: Nome do seu connectormetadata.labels.strimzi.io/cluster
: Nome do seu Kafka Connect Cluster criado anteriormentespecs.config.connection.url
: URL de conexão pro seu banco de dados postgresspecs.config.connection.user
especs.config.connection.password
: Usuário e senha do seu banco de dados.
7.2. Aplique o manifesto:
$ k apply -f kafka-strimzi-k8s-v1beta1/source-connector/ingest-src-postgres-customers-json.yml
7.3. Confira se o Connector está disponível:
$ k get kafkaconnectors
Com isso já conseguiremos ver nossos dados do Postgres no tópico Kafka. Pra fazer isso basta rodar o script de ingestão de dados e em seguida executar o comando:
$ k exec nome-pod-broker -c kafka -it -- bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --property print.key=true --from-beginning --topic src-postgres-customers-json
9.1. Mude para o namespace processing
$ kubens processing
9.2. O KSQLDB não faz parte da stack do Strimzi, mas conseguimos integrar as ferramentas.
9.3. No arquivo deployment.yml, customize os campos
spec.template.spec.containers.env.KSQL_BOOTSTRAP_SERVERS.value
: Nome do svc do seu cluster Kafka
9.4. Aplique os manifestos simultaneamente
$ k apply -f ksqldb-server/manifests/
9.5. Confira se deu certo
$ k get pods
9.6. Para criarmos as streams precisaremos utilizar o shell do KSQL.
$ k exec nome-do-pod -it -- bash ksql
9.7. Dentro do KSQL existem alguns comandos úteis como:
show topics;
- Mostra os tópicos Kafka disponíveis pra serem consumidos pelo KSQL.show streams;
- Mostra as streams criadas.show queries;
- Mostra as queries de transformação criadas.
9.8. Pra criar a source stream que lê o tópico você deve rodar o SQL src-postgres-customers-json.sql no shell do KSQLDB.
9.9. Para transformar os registros JSON em formato tabular, vamos criar uma query a partir da stream criada anteriormente, essa query vai criar um novo tópico com os dados em formato tabular.
9.10. Para criar a query você deve rodar o SQL output_ksqldb_stream_customers_json.sql no shell do KSQLDB.
9.11. Agora é possivel usar SQL no KSQLDB e ver em "tempo-real" o resultado. Por exemplo, rode uma das queries SQL disponíveis em select_output_stream_customers.sql e em seguida execute o script de inserção de dados. Você verá os valores mudando a medida que eles chegam no tópico do Kafka.
10.1. Mude para o namespace datastorage
$ kubens datastorage
10.2. Execute o script deploy-pinot.sh
10.3. Confira se deu certo
$ k get pods
10.4. No arquivo customers-table.json você deve customizar o campo:
tableIndexConfig.stream.kafka.broker.list
- Nome do svc do seu cluster Kafka
10.5. Pra criar a tabela Customers no Pinot temos que executar o script add-table-pinot.sh
10.6. Para conseguir acessar a UI do Pinot, você deve executar o arquivo port-forward-pinot.sh, caso ele não funcione você pode executar o comando
$ k port-forward service/pinot-controller 9000:9000 -n datastorage
OBS: Esse comando vai reservar seu terminal e forçá-lo a usar outro terminal
10.7. O Pinot estará disponível em http://localhost:9000. Nele você pode executar uma query e conferir os valores sendo atualizados a medida que novos dados passam pela transformação do KSQL.
11.1 Aplique o manifesto do superset
$ k apply -f superset/superset.yaml
11.2. Confira se deu certo
$ k get pods
11.3 Crie o ADMIN do superset
$ k exec superset-0 -n datastorage -it -- bash -c 'flask fab create-admin'
11.4 Faça os migrates necessários e importe a datasource do Pinot executando o arquivo startup-sh
11.5 Para conseguir acessar a UI do Superset, você deve executar o arquivo open-superset-ui.sh , caso ele não funcione você pode executar o comando
$ kubectl port-forward service/superset 8088:8088 -n datastorage
OBS: Esse comando vai reservar seu terminal e forçá-lo a usar outro terminal
11.6. O Superset estará disponível em http://localhost:8088. Nele você pode executar queries e construir dashboards com os dados proveninentes do Pinot.
- Monitorar o cluster EKS com o Prometheus ou com o Kubernetes Dashboard
- Avaliar se deve subir com máquinas maiores
- Fazer o S3-sink-connector funcionar
- Criar workflows com o Github Actions ou Argo CD