Arquitetura real · Staff
Spark e Storm: depois do MapReduce (arquiteturas Lambda e Kappa)
Arquitetura real em produção. Pontos centrais: semântica de processamento de streams.
Resposta curta
Arquitetura real em produção. Pontos centrais: semântica de processamento de streams. Nos frameworks de análise em cluster da época do paper dos RDDs, como o MapReduce, reaproveitar dados entre duas computações tinha um custo alto: na maior parte deles, o único caminho era gravar o resultado num sistema de armazenamento estável externo, como um sistema de arquivos distribuído.
01 · CONTEXTO
O que o MapReduce deixou sem resposta
Nos frameworks de análise em cluster da época do paper dos RDDs, como o MapReduce, reaproveitar dados entre duas computações tinha um custo alto: na maior parte deles, o único caminho era gravar o resultado num sistema de armazenamento estável externo, como um sistema de arquivos distribuído. Esse caminho traz sobrecarga de replicação, de I/O de disco e de serialização.
O Spark nasce dessa limitação. O paper que o apresenta parte de duas classes de aplicação que os frameworks da época tratavam de forma ineficiente: algoritmos iterativos e ferramentas interativas de mineração de dados. A resposta do Spark a essas duas classes é o ponto de partida deste caso, que segue até o processamento de streams.
02 · RDDS E LINHAGEM
Dados em memória sem pagar a réplica
Para reaproveitar dados entre duas computações, a maioria dos frameworks da época exigia gravá-los no armazenamento estável externo.
Com RDDs, o usuário pode pedir explicitamente que resultados intermediários fiquem persistidos em memória.
Se uma partição de um RDD se perde, o RDD tem informação suficiente sobre como foi derivado de outros RDDs para recomputar apenas aquela partição.
A tolerância a falhas vem de registrar as transformações usadas para construir o conjunto, a linhagem, em vez dos dados em si.
O truque está na interface. Os RDDs oferecem transformações de granularidade grossa, como map, filter e join, que aplicam a mesma operação a muitos itens. Já nas interfaces de atualização fina de estado, as únicas formas de tolerar falhas são replicar os dados entre máquinas ou registrar as atualizações em log entre máquinas.
03 · STREAMING EM MICROLOTES
Spark Streaming: o fluxo vira uma sequência de lotes
O próprio paper dos RDDs aponta o caminho do processamento em lotes periódicos: aplicações que atualizam um resultado com dados novos, como estatísticas de cliques em anúncios a cada 15 minutos, combinando o estado da janela anterior com os logs novos. Os sistemas desse tipo citados no paper guardam o estado da aplicação em sistemas de arquivos distribuídos, e o passo seguinte, neste caso, é ver como o Spark Streaming trata esse fluxo em pipelines de dados.
O Spark Streaming recebe fluxos de dados ao vivo, de fontes como Kafka e Kinesis, e os divide em lotes.
Cada lote é processado pelo motor do Spark, e o fluxo de resultados também sai em lotes.
Para evitar a perda dos dados já recebidos, o Spark introduziu logs de escrita antecipada; com eles e com receivers confiáveis não há perda de dados, e a semântica é de pelo menos uma vez.
Para exatamente uma vez de ponta a ponta, cada etapa do processamento precisa oferecer essa garantia, inclusive a entrega ao destino.
04 · STORM
Topologias que rodam para sempre
No Storm, a lógica da aplicação é uma topologia: um grafo de spouts e bolts ligados por stream groupings, que roda para sempre, ao contrário de um job MapReduce.
O stream é uma sequência ilimitada de tuplas, processada e criada em paralelo de forma distribuída.
Uma tupla que saiu do spout é considerada totalmente processada quando a árvore de tuplas foi esgotada e todas as mensagens da árvore foram processadas.
Se a árvore não é totalmente processada e a tupla estoura o tempo limite, o Storm chama o método fail no spout; com tuplas ancoradas, a tupla raiz é reemitida.
| Aspecto | Spark Streaming | Storm |
|---|---|---|
| Abstração | Fluxo discretizado (DStream), processado em lotes pelo motor do Spark | Fluxo ilimitado de tuplas numa topologia de spouts e bolts |
| Execução | Lotes processados pelo motor do Spark, com saída também em lotes | Topologia que roda para sempre, ao contrário de um job MapReduce |
| Garantias | Transformação exatamente uma vez graças aos RDDs; a recepção depende da fonte | Melhor esforço, pelo menos uma vez e, com o Trident, exatamente uma vez |
05 · SEMÂNTICA DE PROCESSAMENTO
Exatamente uma vez, mas onde?
Na documentação do Spark Streaming, o processamento de qualquer stream tem, em linhas gerais, três etapas. Na etapa de transformação, todos os dados recebidos são processados exatamente uma vez, graças às garantias dos RDDs, desde que os dados de entrada recebidos continuem acessíveis. Já na recepção, cada fonte de entrada oferece garantias diferentes, e por isso a garantia de ponta a ponta depende de todas as etapas.
No Storm, a página sobre garantia de processamento descreve o nível de pelo menos uma vez com base na árvore de tuplas, no tempo limite que gera falha e na reemissão da tupla raiz.
06 · ARQUITETURA LAMBDA
Duas camadas para consultas rápidas e corrigíveis
Os eventos chegam a um conjunto mestre de dados imutáveis, que só recebe acréscimos.
A camada batch pré-computa as consultas sobre todo o conjunto de dados, o jeito mais fácil de deixá-las rápidas.
Os dados mais antigos que algumas horas já estão nas views batch; a camada de tempo real pré-computa as consultas só para as últimas horas.
Para responder, o serviço consulta a view batch e a view de tempo real e junta os resultados.
Um erro na camada de tempo real é corrigido pela camada batch, que acaba sobrescrevendo o que o tempo real calculou.
O mesmo desenho dá um caminho de correção. Se uma consulta tem um bug, basta corrigir, publicar a versão corrigida e recomputar tudo a partir do conjunto mestre; e, como os dados são imutáveis e o conjunto só recebe acréscimos, gravar dado ruim não sobrescreve nem destrói dado bom.
07 · ATUALIDADE
O que mudou desde então
A documentação atual do Spark descreve o Spark Streaming (DStreams) como a geração anterior do motor de streaming do Spark.
Perguntas frequentes
O que é Spark e Storm: depois do MapReduce (arquiteturas Lambda e Kappa)?
Arquitetura real em produção. Pontos centrais: semântica de processamento de streams.
O que o design de Spark e Storm: depois do MapReduce (arquiteturas Lambda e Kappa) cobre?
Ele está organizado nestas seções: O que o MapReduce deixou sem resposta, Dados em memória sem pagar a réplica, Spark Streaming: o fluxo vira uma sequência de lotes, Topologias que rodam para sempre, Exatamente uma vez, mas onde? e Duas camadas para consultas rápidas e corrigíveis.
Quanto tempo leva Spark e Storm: depois do MapReduce (arquiteturas Lambda e Kappa) e qual é o nível?
Leva cerca de 18 minutos para ler e tem nível Staff.
Agora projete você mesmo
Rode este caso como uma entrevista na escola de System Design: você toma as decisões, o tutor as questiona e você vê a nota do seu desenho.