Laboratório de Flink 0 - Experimentos com streaming
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.tgzDepois disso devemos descompactar:
tar xf flink-2.1.1-bin-scala\_2.12.tgzAcessamos o seu diretório:
cd flink-2.1.1realizando 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.shPode-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
doneA 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.txt3 - 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 9000Depois 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 9000Volte 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/*outAlgumas opções da linha de comando do Flink
Podemos dar o comando:
./bin/flink --helpE 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/*outConclusã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.