Fluxo de dados para quê?

A realidade muda a todo instante, assim como as nuvens, imaginar uma realidade imutável é algo impossível, por isso para manter a estabilidade de um sistema qualquer é necessário entender como a realidade (do latim realis, significa o que é verdadeiro ou real) opera, pois a tendência é que todo sistema seja instâvel.

Sendo assim, podemos imaginar um sistema IoT com centenas de dispositivos, talvez milhares, onde a sincronicidade deve ser garantida para realizar alguma tarefa ou então, podemos pensar em monitoramento para auxiliar o marketing em redes sociais, no caso este trabalho que foi publicado em um artigo fala exatamente sobre isso.

Mas como construir um sistema desse tipo? Pois é necessário analisar o fluxo de dados, não os dados em lote (quando já temos um conjunto de dados), isso nos dá uma perspectiva da realidade em tempo real, contribuindo para práticas de OSINT diversas, por exemplo: Uma das táticas de publicidade é monitorar o seu sinal de celular dentro de shoppings e assim saber quais vitrinas você observou, tendo esses dados em fluxo é possível saber o momento exato que uma promoção deve ser anunciada no microfone, uma intervenção deve ser feita no trânsito da cidade, controlar sinal de trânsito, aplicativos de corrida e afins.

0 - Preparando o ambiente
1 - Iniciando o Flink em modo Cluster
2 - Exemplo do WordCount
3 - Exemplo do SocketWindowWordCount
4 - Python com o Flink
5 - Algumas opções de linha de comando do Flink
6 - Automatizando o processo completo do SocketWindowWordCount

0 - Preparando o ambiente

Vamos utilizar uma distribuição Linux, pode ser Ubuntu, mas o importante é que tenhamos acesso ao terminal, podemos obter o Flink neste link e realizar seu download com o comando:

wget https://dlcdn.apache.org/flink/flink-2.1.1/flink-2.1.1-bin-scala\_2.12.tgz

Depois disso devemos descompactar:

tar xf flink-2.1.1-bin-scala\_2.12.tgz

Acessamos o seu diretório:

cd flink-2.1.1

realizando o comando ls você deve ver os diretórios disponíveis no projeto.

1 - Inici4ndo o Flink em m0do clust3r

Com o seguinte comando o cluster é iniciado:

./flink-2.1.1/bin/start-cluster.sh

Pode-se verificar sua execução acessando [http://localhost:8081]{:target=”_blank”}, pois o Flink tem interface web disponível para verificar informações sobre as tarefas executadas.

2 - Realizando o WordC0unt

Podemos gerar um arquivo com vários números com o seguinte Shell Script:

LINE=""
>numbers.txt
for j in {1..1000}
do
    for i in {1..100}
    do
        LINE+=" $RANDOM"
    done
    echo $LINE >> numbers.txt
done

A prática de contar palavras, nesse caso, podemos considerar que seja em lote, pois temos um arquivo que não é dado como um fluxo de dados. Podemos usar o comando:

./flink-2.1.1/bin/flink run /examples/batch/WordCount.jar --input numbers.txt --output numbers-wordcount.txt

3 - Exemplo do SocketWindowWordCount

Podemos criar um fluxo de dados para o Flink fazer uma análise, no caso temos o exemplo que usa uma janela de tempo para realizar a análise, o que é interessante para analisar cenários mais dinâmicos.

Para isso precisamos abrir uma porta usando o netcat:

nc -l 9000

Depois disso, podemos executar o Flink, que irá se conectar na porta que foi disponibilizada:

./flink-2.1.1/bin/flink run ./flink-2.1.1/examples/streaming/SocketWindowWordCount.jar --port 9000

Volte no terminal que está com o netcat sendo executado, digite algumas mensagens ou palavras aleatórias, sempre pressionando enter.

Depois de enviar sua mensagem, pressione CTRL+C para finalizar o netcat, volte no terminal do Flink e a tarefa deve ter sido finalizada.

Sendo assim, haverá o registro de saída da contagem de palavras no fluxo de tempo, podemos verificar com:

cat ./flink-2.1.1/log/*out

Algumas opções da linha de comando do Flink

Podemos dar o comando:

./bin/flink --help

E veremos dezenas de comandos interessantes da aplicação, a dica é ler tudo isso, mas destaco a opção -p, que possibilita executar várias threads no mesmo computador, portanto poderíamos disponibilizar várias portas com o netcat por exemplo e colocar o Flink para obter streaming de dados de várias ao mesmo tempo.

Automatizando o processo completo do SocketWindowWordCount

Podemos criar um programa em bash para automatizar todo o processo que vimos no item sobre o SocketWindowsWordCount:

#!/bin/bash

[ -e "flink-2.1.1-bin-scala_2.12.tgz" ] || wget "https://dlcdn.apache.org/flink/flink-2.1.1/flink-2.1.1-bin-scala_2.12.tgz" && tar xf "flink-2.1.1-bin-scala_2.12.tgz"

curl -s --max-time 5 http://localhost:8081/overview | grep '"taskmanagers"' || ./flink-2.1.1/bin/start-cluster.sh

>numbers.txt
for i in {1..100}
do
    LINE="$RANDOM"
    for i in {1..100}
    do
        LINE+=" $RANDOM"
    done
        echo $LINE >> numbers.txt
done


timeout 10 cat numbers.txt | nc -l 9999 &

sleep 4
timeout 30 ./flink-2.1.1/bin/flink run ./flink-2.1.1/examples/streaming/SocketWindowWordCount.jar --hostname 127.0.0.1 --port 9999 &
sleep 20


echo "Deseja parar o cluster flink? [S/N]"
read CHOICE

[ $CHOICE == "S" ] && ./flink-2.1.1/bin/stop-cluster.sh

cat ./flink-2.1.1/log/*out

Conclusão

Esse foi o primeiro texto sobre o Apache Flink, com uma ideia de proporcionar a capacidade de primeiro interagir com o projeto e ter uma ideia de seu funcionamento.