Este post é um guest publicação escrito por Yaroslav Tkachenko, Arquiteto de Software da Activision.
Apache Spark é uma das mais populares e poderosas estruturas de processamento de dados em larga escala. Ele foi criado como uma alternativa ao framework MapReduce de Hadoop para cargas de trabalho em lote, mas agora ele também suporta SQL, aprendizagem de máquinas e processamento de fluxo. Hoje eu quero focar em Spark Streaming e mostrar algumas opções disponíveis para processamento de fluxo.
processamento de dados de fluxo é usado quando os dados dinâmicos são gerados continuamente, e muitas vezes é 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, desenhar painéis e modelos de aprendizagem da máquina de alimentação que podem reagir rapidamente às novas tendências dentro dos dados.
DStreams vs. DataFrames
a transmissão de faíscas foi alfa com faísca 0.7.0. É baseado na ideia de riachos discretizados ou DStreams. Cada DStream é representado como uma seqüência de RDDs, então é fácil de usar se você está vindo de um nível baixo de RDD-backed lotes de trabalho. DStreams passou por muitas melhorias ao longo desse período de tempo, mas ainda havia vários desafios, principalmente porque é uma API de nível muito baixo.
como solução para esses desafios, a transmissão estruturada de faíscas foi introduzida na Spark 2.0 (e tornou-se estável em 2.2) como uma extensão construída em cima da Spark SQL. Por causa disso, ele tira vantagem do código SQL Spark e otimizações de memória. Streaming estruturado também dá abstrações muito poderosas como Dataset/DataFrame APIs, bem como SQL. Chega de lidar directamente com o RDD!
ambos os Streaming estruturado 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 exatamente-uma vez a entrega com 100 milisegundos latência, enquanto o Streaming com DStreams abordagem só garante pelo menos uma vez a entrega, MAS Pode fornecer latências milissegundas.
eu pessoalmente prefiro Spark Structured Streaming para casos de uso simples, mas 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 é normalmente usado com streaming estruturado Spark) para consumir e processar dados do Apache Kafka. Vou usar Scala, Apache Spark 2.3, e Apache Kafka 2.0.
também, por exemplo, vou executar meus trabalhos usando Cadernos Apache Zeppelin fornecidos por Qubole. Qubole é uma plataforma de dados que eu uso diariamente. Ele gerencia Hadoop e Spark clusters, faz com que seja fácil executar Colmeia ad hoc e consultas Presto, e também fornece Cadernos gerenciados Zeppelin que eu uso com prazer. Com o Qubole, não preciso de pensar muito em Configurar e afinar a faísca e o Zeppelin, está tudo tratado para mim.
o caso de uso real que eu tenho é muito simples:
- uma espécie de telemetria foi escrita a Kafka.: pequenas mensagens JSON com os metadados e arbitrária de pares chave/valor
- eu quero ligar para Kafka, consumir, e desserializar essas mensagens
- , em Seguida, aplicar transformações, se necessário
- Recolher algumas agregações
- Finalmente, eu estou interessado em anomalias e, geralmente, dados errados — desde que eu não controlo o produtor, eu quero pegar coisas como Nulos, seqüências de caracteres vazias, talvez datas incorretas e outros valores com formatos específicos, etc.
- o trabalho deve ser executado por algum tempo, em seguida, terminar automaticamente. Tipicamente, Spark Streaming jobs funciona continuamente, mas às vezes pode ser útil para executá-lo ad hoc para análise/depuração (ou como um exemplo no meu caso, uma vez que é tão fácil de executar um Spark job em um notebook).
Streaming with DStreams
In this approach we use DStreams, which is simply a collection of RDDs.
Streaming with DataFrames
Now we can try to combine Streaming with DataFrames API to get the best of both worlds!
conclusão
qual abordagem é melhor? Uma vez que DStream é apenas uma coleção de RDDs, é tipicamente usado para transformações de baixo nível e processamento. Adicionando uma API DataFrames em cima disso fornece abstrações muito poderosas como SQL, mas requer um pouco mais de configuração. E se você tem um caso de uso simples, Spark Streaming estruturado pode ser uma solução melhor em geral!