depuração com a UI do Apache Spark
Este artigo descreve as diferentes opções de depuração disponíveis para ver os componentes internos de suas aplicações Spark Apache. Os três locais importantes para procurar são:
IU do Spark
Logs do driver
Executor logs
Consulte Diagnosticar problemas de custo e desempenho usando o site Spark UI para obter informações sobre como diagnosticar problemas de custo e desempenho usando o site Spark UI.
Spark UI
Quando o senhor começa a acessar Job, o site Spark UI mostra informações sobre o que está acontecendo no seu aplicativo. Para acessar o site Spark UI, clique no link em anexo compute:
guia de transmissão
Ao acessar o site Spark UI, o senhor verá uma transmissão tab se uma transmissão Job estiver em execução nesse site compute. Se não houver nenhuma transmissão Job em execução neste compute, este tab não estará visível. O senhor pode pular para Logs de driver para saber como verificar as exceções que podem ter ocorrido ao iniciar a transmissão Job.
A primeira coisa a procurar nessa página é verificar se o aplicativo de transmissão está recebendo algum evento de entrada da fonte. Nesse caso, o senhor pode ver que o site Job recebe 1.000 eventos por segundo.
Se o senhor tiver um aplicativo que recebe várias transmissões de entrada, poderá clicar no link Input Rate (Taxa de entrada ), que mostrará o número de eventos recebidos para cada receptor.
Tempo de processamento
Ao rolar a tela para baixo, encontre o gráfico de Tempo de processamento. Esse é um dos key gráficos para entender o desempenho de sua transmissão Job. Como regra geral, é bom que o senhor possa processar cada lote dentro de 80% do seu tempo de processamento de lotes.
Para esse aplicativo, o intervalo de lotes foi de 2 segundos. O tempo médio de processamento é de 450 ms, o que está bem abaixo do intervalo de lotes. Se o tempo médio de processamento for menor ou maior do que o intervalo de lotes, o senhor terá um aplicativo de transmissão que começará a entrar na fila, resultando em um acúmulo de pedidos em breve, o que pode acabar prejudicando sua transmissão Job.
Lotes concluídos
No final da página, o senhor verá uma lista de todos os lotes concluídos. A página exibe detalhes sobre os últimos 1.000 lotes concluídos. Na tabela, o senhor pode obter o número de eventos processados para cada lote e seu tempo de processamento. Se quiser saber mais sobre o que aconteceu em um dos lotes, o senhor pode clicar no link dos lotes para acessar a página de detalhes dos lotes.
página de detalhes dos lotes
Esta página tem todos os detalhes que o senhor deseja saber sobre um lote. Duas key coisas são:
Entrada: Contém detalhes sobre a entrada para os lotes. Nesse caso, ele tem detalhes sobre o tópico, a partição e os offsets do Apache Kafka lidos pela transmissão estruturada do Spark para esse lote. No caso do TextFileStream, o senhor vê uma lista de nomes de arquivos que foram lidos para esse lote. Essa é a melhor maneira de iniciar a leitura do aplicativo de depuração e transmissão de arquivos de texto.
Processamento: O senhor pode clicar no link para o Job ID, que contém todos os detalhes sobre o processamento realizado durante esse lote.
Job página de detalhes
A página de detalhes Job mostra uma visualização DAG. Isso é muito útil para entender a ordem das operações e dependências de cada lote. Nesse caso, você pode ver que os lotes lêem a entrada da transmissão direta do Kafka seguida por um mapa plano de operações e, em seguida, um mapa de operações. A transmissão resultante foi então usada para atualizar um estado global usando updateStateByKey. (As caixas cinzas representam passos ignoradas. O Spark é inteligente o suficiente para pular alguns estágios se eles não precisarem ser recalculados. Se os dados forem marcados ou armazenados em cache, o Spark ignorará a recomputação desses estágios. Nesse caso, esses estágios correspondem à dependência de lotes anteriores por causa de updateStateBykey
. Como o Spark transmissão estructurada verifica internamente os pontos de verificação da transmissão e lê a partir do ponto de verificação em vez de depender dos lotes anteriores, eles são mostrados como estágios acinzentados.)
Na parte inferior da página, o senhor também encontrará a lista de trabalhos que foram executados para esse lote. O senhor pode clicar nos links da descrição para aprofundar a execução no nível da tarefa.
Página de detalhes da tarefa
Esse é o nível mais granular de depuração que o senhor pode obter no site Spark UI para aplicativos Spark. Esta página contém todas as tarefas que foram executadas para esse lote. Se o senhor estiver investigando problemas de desempenho do seu aplicativo de transmissão, essa página fornecerá informações como o número de tarefas que foram executadas e onde foram executadas (em qual executor) e informações de embaralhamento
Dica
Certifique-se de que a tarefa seja executada em vários executores (nós) em seu site compute para ter paralelismo suficiente durante o processamento. Se o senhor tiver um único receptor, às vezes apenas um executor poderá estar fazendo todo o trabalho, embora haja mais de um executor em seu site compute.
Descarte de linha
Um thread dump mostra um Snapshot dos estados de thread de uma JVM.
Os despejos de thread são úteis na depuração de uma tarefa específica suspensa ou de execução lenta. Para view o despejo de thread de uma tarefa específica no site Spark UI:
Clique em Jobs tab.
Na tabela Jobs, localize o destino Job que corresponde ao thread dump que o senhor deseja ver e clique no link na coluna Description.
Na tabela Job's Stages (Estágios ), localize o estágio de destino que corresponde ao thread dump que você deseja ver e clique no link na coluna Description (Descrição ).
Na lista de tarefas do estágio, localize a tarefa de destino que corresponde ao despejo de thread que o senhor deseja ver e anote os valores de ID da tarefa e ID do executor.
Clique no executor tab.
Na tabela do executor, encontre a linha que contém o valor de IDexecutor que corresponde ao valor de IDexecutor que o senhor observou anteriormente. Nessa linha, clique no link na coluna Thread Dump.
Na tabela Thread dump for executor, clique na linha em que a coluna Thread Name contém TID seguido do valor de ID da tarefa que o senhor observou anteriormente. (Se a tarefa tiver terminado de ser executada, o senhor não encontrará um thread correspondente). O despejo de thread da tarefa é mostrado.
Os despejos de thread também são úteis para problemas de depuração em que o driver parece estar travado (por exemplo, nenhuma barra de progresso do Spark está sendo exibida) ou não está progredindo nas consultas (por exemplo, as barras de progresso do Spark estão presas em 100%). Para view o thread dump do driver em Spark UI:
Clique no executor tab.
Na tabela do executor, na linha do driver, clique no link na coluna Thread Dump. O thread dump do driver é mostrado.
Registros do motorista
O driver logs é útil para duas finalidades:
Exceções: Às vezes, o senhor pode não ver a transmissão tab no site Spark UI. Isso ocorre porque a transmissão Job não foi iniciada por causa de alguma exceção. O senhor pode pesquisar nos logs do driver para ver o rastreamento de pilha da exceção. Em alguns casos, a transmissão Job pode ter começado corretamente. Mas o senhor verá todos os lotes sem nunca ir para a seção Lotes concluídos. Todos eles podem estar em processamento ou em estado de falência. Nesses casos também, o motorista logs pode ser útil para entender a natureza dos problemas subjacentes.
Impressões: Todas as instruções de impressão como parte do DAG também aparecem no site logs.
Registros do executor
Os logs do executor às vezes são úteis se o senhor perceber que determinadas tarefas estão se comportando mal e quiser ver os logs de tarefas específicas. Na página de detalhes da tarefa mostrada acima, o senhor pode obter o executor onde a tarefa foi executada. Depois disso, o senhor pode acessar a página da interface do usuário compute, clicar em #nodes e, em seguida, no master. A página principal lista todos os funcionários. O senhor pode escolher o site worker onde a tarefa suspeita foi executada e, em seguida, acessar a saída do log4j.