Um Spark Streaming pode sobreviver ao Chaos Monkey?
Traduzido por Carla Matheus Carneiro
A Netflix é uma organização orientada a dados que prioriza a
qualidade dos dados coletados e processados. Em nosso post anterior, nós destacamos
os casos de processamento de fluxo em tempo real no contexto das recomendações
online e do monitoramento de dados. Ao escolhermos o Spark Streaming como nosso
processador de fluxo, nós nos propusemos a avaliar e compartilhar o histórico
de resiliência do Spark Streaming no ambiente da nuvem AWS. Uma abordagem baseada no Chaos Monkey, que finalizou
aleatoriamente instâncias ou processos, foi empregada para simular falhas.
O Spark na Amazon Web Services (AWS) é importante já
que a Netflix transmite seu serviço principalmente fora da nuvem AWS. Sistemas
de processamento de fluxo precisam operar em 24/7, além de serem tolerantes a
falhas. Instâncias na AWS são efêmeras, o que torna imprescindível garantir a
resiliência do Spark.
Componentes
do Spark
O Apache Spark é um sistema de computação em
cluster rápido e genérico. O Spark pode ser implantado no Mesos, no próprio
gerenciador de cluster do Yarn ou Spark, que aloca os recursos do nó de
trabalho para uma aplicação. O Spark Driver se conecta ao gerenciador de
cluster e é responsável pela conversão de uma aplicação em um grafo acíclico
direto (DAG) de tarefas individuais que são executadas dentro de um processo
nos nós de trabalho.
Criando
o Chaos
Os dispositivos de transmissão Netflix enviam periodicamente
eventos que capturam as atividades dos membros, o que tem um papel
significativo na personalização. Esses eventos vão para nossas aplicações no
servidor e são encaminhados para o Kafka. Nossa aplicação de transmissão Spark
utiliza esses eventos do Kafka e calcula métricas. A arquitetura de implantação
está demonstrada abaixo:
Figura 2: Arquitetura de Implantação
Nosso objetivo é assegurar que não haja interrupção no cálculo de
métricas quando os diferentes componentes Spark falham. Para simular tais
falhas, nós aplicamos uma abordagem "whack-a-mole" (processo
repetitivo de eliminação) e eliminamos os vários componentes Spark.
Nós executamos nossa aplicação de transmissão spark no Spark
Standalone. O exercício de resiliência foi executado com o Spark v1.2.0, Kafka
v0.8.0 e Zookeeper v3.4.5.
A
Resiliência do Spark Streaming
Resiliência do
Driver: O Spark Standalone suporta dois
modos de iniciar o aplicativo de driver. No modo cliente, o aplicativo de
driver é iniciado no mesmo processo como aquele em que o cliente envia a
aplicação. Quando esse processo morre, o aplicativo é abortado. No
modo cluster, o aplicativo é iniciado a partir de um processo de trabalho no
cluster. Além disso, o modo standalone cluster suporta uma opção de
supervisão que permite reiniciar o aplicativo automaticamente em códigos de saída
diferente de zero.
Resiliência do
Master: A agenda Spark utiliza o
Master para tomar decisões agendadas. Para evitar qualquer ponto de
falha, é melhor configurar um multi master standalone cluster. O
Spark utiliza o Zookeeper para definir um líder. Um dos nós master se torna um
nó ATIVO e todos os nós de trabalho ficam registrados nele. Quando esse nó
master morre, um dos nós master STANDBY se torna o nó ATIVO e todos os nós de
trabalho ficam automaticamente registrados nele. Se houver qualquer aplicação
sendo executada no cluster durante a falha do master, elas ainda continuarão
funcionando sem nenhuma falha.
Resiliência do
Processo de Trabalho: O processo de trabalho inicia e
monitora o Executor e o Driver como processos primários. Quando o processo de
trabalho morre, todos os seus processos primários também morrem. O
processo de trabalho reinicia automaticamente, que por sua vez reinicia o
processo do Driver e/ou do Executor.
Resiliência do
Executor: Quando o processo Executor morre,
eles são automaticamente reiniciados pelo processo de trabalho e quaisquer
tarefas que estiverem suspensas são reagendadas.
Resiliência do
Receptor: O Receptor é executado como uma
longa tarefa em um Executor e tem as mesmas características de resiliência de
um executor.
O efeito sobre as métricas calculadas, em função do término de
vários componentes Spark, está demonstrado abaixo.
Figura 3: O comportamento na falha do Receptor/Driver/Master
Falha do Driver: O principal impacto está na contra-pressão acumulada devido a uma
falha do nó, o que resulta em uma queda brusca no processamento de mensagens,
seguido de um pico, antes que o grafo fique estável.
Falha do
Receptor: A queda nas métricas calculadas
ocorreu devido ao fato do receptor padrão Kafka ser um receptor não confiável. O Spark
streaming 1.2 traz um recurso experimental chamado write ahead logs que faz do kafka
um receptor confiável. Quando estiver habilitado, as aplicações terão
êxito com o receptor de transferência Kafka. No entanto, isso pode ser
abordado através do aumento do número de receptores.
Resumo
A tabela abaixo resume as características de
resiliência dos diferentes componentes Spark:
Nós encontramos alguns erros (SPARK-5967, SPARK-3495, SPARK-3496, etc.) durante este exercício, porém a equipe Spark Streaming foi
capaz de corrigí-los em tempo. A performance Spark ainda está em teste e os
resultados serão divulgados em posts no blog.
No geral, estamos satisfeitos com a resiliência do spark
standalone e animados para chegar ao próximo nível em que estamos trabalhando a
fim de construir uma Arquitetura
Lambda unificada que envolve uma
combinação de lote e transmissão em tempo real de processamento. Estamos
nos estágios iniciais desse desenvolvimento, por isso, se você tiver interesse
em contribuir, por favor entre em contato conosco.




