DStreams vs. DataFrames: Two Flavors of Spark Streaming
Este post é uma publicação convidada escrita por Yaroslav Tkachenko, um Arquitecto de Software na Activision.
Apache Spark é uma das mais populares e poderosas frameworks de processamento de dados em larga escala. Foi criado como uma alternativa ao framework MapReduce da Hadoop para cargas de trabalho em lote, mas agora também suporta SQL, aprendizado de máquina, e processamento de fluxo contínuo. Hoje eu quero focar no Spark Streaming e mostrar algumas opções disponíveis para processamento de fluxo.
O processamento de dados de fluxo é usado quando os dados dinâmicos são gerados continuamente, e é frequentemente encontrado em grandes casos de uso de dados. Na maioria dos casos os dados são processados em tempo quase real, um registro de cada vez, e os insights derivados dos dados também são usados para fornecer alertas, renderizar painéis e alimentar modelos de aprendizagem da máquina que podem reagir rapidamente a novas tendências dentro dos dados.
Dtreams vs. DataFrames
Spark Streaming foi alfa com Spark 0.7.0. É baseado na idéia de fluxos discretizados ou DStreams. Cada DStream é representado como uma sequência de RDDs, por isso é fácil de usar se você estiver vindo de cargas de trabalho em lote com RDD de baixo nível. Os DStreams sofreram muitas melhorias durante esse período de tempo, mas ainda havia vários desafios, principalmente porque é uma API de nível muito baixo.
Como uma solução para esses desafios, o Spark Structured Streaming foi introduzido no Spark 2.0 (e se tornou estável no 2.2) como uma extensão construída em cima do Spark SQL. Por causa disso, ele aproveita o código Spark SQL e otimizações de memória. Structured Streaming também dá abstrações muito poderosas como Dataset/DataFrame APIs assim como SQL. Chega de lidar diretamente com RDD!
Both Structured Streaming e Streaming com DStreams usam micro-batching. A maior diferença é a latência e as garantias de entrega de mensagens: O Streaming Estruturado oferece entrega exatamente na hora com latência de mais de 100 milissegundos, enquanto o Streaming com DStreams só garante entrega na hora, mas pode fornecer latências de milissegundos.
Eu pessoalmente prefiro o Spark Structured Streaming para casos de uso simples, mas o Spark Streaming com DStreams é realmente bom para topologias mais complicadas por causa de sua flexibilidade. É por isso que abaixo eu quero mostrar como usar Streaming com DStreams e Streaming com DataFrames (que é tipicamente usado com Spark Structured Streaming) para consumir e processar dados do Apache Kafka. Eu vou usar Scala, Apache Spark 2.3, e Apache Kafka 2.0.
Também, por exemplo, vou executar meus trabalhos usando os notebooks Apache Zeppelin fornecidos pelo Qubole. Qubole é uma plataforma de dados que eu uso diariamente. Ele gerencia os clusters Hadoop e Spark, facilita a execução de consultas ad hoc Hive e Presto, e também fornece notebooks gerenciados Zeppelin que eu uso com prazer. Com o Qubole não preciso de pensar muito na configuração e afinação do Spark e do Zeppelin, para mim é apenas manuseado.
O caso de uso real que tenho é muito simples:
- Um tipo de telemetria é escrito para Kafka: pequenas mensagens JSON com metadados e pares de chaves/valores arbitrários
- Quero ligar-me a Kafka, consumir e desserializar essas mensagens
- Aplicar transformações se necessário
- Colher algumas agregações
- Finalmente, Estou interessado em anomalias e dados geralmente maus – uma vez que não controlo o produtor, quero apanhar coisas como NULLs, cordas vazias, talvez datas incorrectas e outros valores com formatos específicos, etc.
- O trabalho deve ser executado por algum tempo, e depois terminar automaticamente. Normalmente, trabalhos Spark Streaming rodam continuamente, mas às vezes pode ser útil rodá-lo ad hoc para análise/debugging (ou como exemplo no meu caso, já que é tão fácil rodar um trabalho Spark em um notebook).
Streaming com DStreams
Nesta abordagem usamos DStreams, que é simplesmente uma coleção de RDDs.
Streaming com DataFrames
Agora podemos tentar combinar Streaming com DataFrames API para obter o melhor de ambos os mundos!
Conclusão
Qual é a melhor abordagem? Como o DStream é apenas uma coleção de RDDs, ele é tipicamente usado para transformações e processamento de baixo nível. A adição de uma API DataFrames em cima disso fornece abstrações muito poderosas como SQL, mas requer um pouco mais de configuração. E se você tiver um caso de uso simples, o Spark Structured Streaming pode ser uma solução melhor em geral!