Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Esta página contém recomendações para agendar cargas de trabalho de Streaming Estruturado usando trabalhos no Azure Databricks.
O Databricks recomenda que você sempre configure o seguinte:
- Remova o código desnecessário de notebooks que poderiam retornar resultados, como
displayecount. - Não execute cargas de trabalho de Structured Streaming usando computação genérica. Sempre agende fluxos como trabalhos usando a computação de trabalhos.
- Agendar trabalhos usando
Continuousmodo. Isso se refere ao recurso de agendamento de Jobs no Azure Databricks, e não ao intervalo de trigger do Structured Streaming. - Não habilite o dimensionamento automático para computação para trabalhos de Streaming Estruturado.
Algumas cargas de trabalho se beneficiam do seguinte:
- Configure o armazenamento de estado do RocksDB no Azure Databricks
- Ponto de verificação de estado assíncrono para consultas com estado
- O que é o acompanhamento de progresso assíncrono?
Azure Databricks introduziu o Lakeflow Spark Declarative Pipelines para reduzir as complexidades do gerenciamento da infraestrutura de produção para cargas de trabalho de Streaming Estruturado. O Databricks recomenda Lakeflow Spark Declarative Pipelines para novos pipelines de Streaming Estruturado. Consulte Pipelines Declarativos do Lakeflow Spark.
Observação
O auto-escalonamento tem limitações ao reduzir o tamanho do cluster para cargas de trabalho de streaming estruturado. O Databricks recomenda usar os pipelines declarativos do Lakeflow Spark com dimensionamento automático aprimorado para cargas de trabalho de streaming. Consulte Otimize a utilização do cluster de Pipelines Declarativos do Lakeflow Spark com Dimensionamento Automático.
:::note computação sem servidor
Na computação sem servidor, apenas Trigger.AvailableNow() e Trigger.Once() são suportados. O Databricks recomenda Trigger.AvailableNow().
Para streaming contínuo na computação sem servidor, use o modo de pipeline disparado versus contínuo no modo contínuo.
Consulte Limitações de streaming.
:::
Projetar cargas de trabalho de streaming para esperar falhas
A Databricks recomenda sempre configurar os trabalhos de streaming para reiniciar automaticamente em caso de falha. Alguns recursos, incluindo a evolução do esquema, exigem que as cargas de trabalho de Streaming Estruturado sejam configuradas para tentar novamente automaticamente. Consulte Configurar trabalhos de Streaming Estruturado para reiniciar consultas de streaming em caso de falha.
Algumas operações como foreachBatch oferecem garantias de pelo menos uma vez, em vez de exatamente uma vez. Para essas operações, verifique se o pipeline de processamento é idempotente. Consulte Usar o foreachBatch para gravar nos coletores de dados arbitrários.
Observação
Quando uma consulta é reiniciada, o microlote planejado durante a execução anterior é processado. Se a tarefa falhou devido a um erro de falta de memória ou você cancelou manualmente uma tarefa devido a um microlote excessivamente grande, talvez seja necessário escalar a computação para processar o microlote de forma bem-sucedida.
Se você alterar as configurações entre as execuções, essas configurações se aplicarão ao primeiro novo lote planejado. Consulte Recuperar após alterações em uma consulta de Streaming Estruturado.
Quando um trabalho é repetido?
Você pode agendar várias tarefas como parte de um trabalho Azure Databricks. Ao configurar um trabalho usando o gatilho contínuo, você não pode definir dependências entre tarefas.
Você pode optar por planejar vários fluxos em um único trabalho usando uma das seguintes abordagens:
- Várias tarefas: defina um trabalho com várias tarefas que executem cargas de trabalho de streaming usando o gatilho contínuo.
- Várias consultas: defina várias consultas de streaming no código-fonte para uma única tarefa.
Você também pode combinar essas estratégias. A tabela a seguir compara essas abordagens.
| Estratégia | Várias tarefas | Várias consultas |
|---|---|---|
| Como a computação é compartilhada? | O Databricks recomenda o dimensionamento adequado dos recursos de computação para cada tarefa de streaming. Opcionalmente, você pode compartilhar a computação entre tarefas. | Todas as consultas compartilham a mesma computação. Você pode, opcionalmente, atribuir consultas a pools de agendador. |
| Como as novas tentativas são tratadas? | Todas as tarefas devem falhar antes que o trabalho seja repetido. | A tarefa será repetida se alguma consulta falhar. |
Configurar processos de Streaming Estruturado para reiniciar as consultas de streaming de dados em caso de falha
O Databricks recomenda configurar todas as cargas de trabalho de streaming usando o gatilho contínuo. Consulte Executar trabalhos continuamente.
O gatilho contínuo tem o seguinte comportamento por padrão:
- Impede mais de uma execução simultânea do trabalho.
- Inicia uma nova execução quando uma execução anterior falha.
- Usa recuo exponencial para novas tentativas.
O Databricks recomenda sempre usar a computação de trabalhos em vez da computação para todas as finalidades ao agendar fluxos de trabalho. Em caso de falha e repetição do trabalho, novos recursos de computação são implantados.
Observação
O Databricks recomenda que você não use streamingQuery.awaitTermination() ou spark.streams.awaitAnyTermination(). Veja quando usar awaitTermination().
Quando usar awaitTermination()
streamingQuery.awaitTermination() e spark.streams.awaitAnyTermination() bloqueiam o thread atual até que uma consulta de streaming seja encerrada. Se usar essas funções depende do ambiente de execução.
Para trabalhos do Databricks, não use streamingQuery.awaitTermination() ou spark.streams.awaitAnyTermination(). Essas funções não são necessárias porque o serviço Jobs impede automaticamente a execução quando uma consulta de streaming está ativa. Ambas as funções impedem que as células do notebook sejam concluídas e impedem que o serviço Trabalhos acompanhe a consulta de streaming, o que interrompe as métricas de backlog e as notificações de trabalho.
Use awaitTermination() nos seguintes casos:
| Caso de uso | Comportamento |
|---|---|
| Notebooks interativos na computação geral |
awaitTermination() mantém a célula de código em execução, e permite observar o estado da consulta, garantindo que as falhas sejam exibidas na saída do notebook. |
| Ambientes locais e de desenvolvimento | Ao executar um programa Spark localmente, o processo é encerrado quando o thread principal é concluído. Chame awaitTermination() para manter o programa ativo até que a consulta de streaming seja concluída ou falhe. |
| Propagação de falha para o driver | Sem awaitTermination(), uma falha de consulta de streaming em um contexto que não seja de trabalho pode não se propagar para o thread de chamada. A consulta pode falhar silenciosamente, tornando as falhas mais difíceis de detectar e diagnosticar. A chamada awaitTermination() gera novamente a exceção de consulta no driver. |
Use os pools de agendador para várias consultas de streaming
Você pode configurar pools de agendador para atribuir capacidade de computação a consultas ao executar várias consultas de streaming do mesmo código-fonte.
Por padrão, todas as consultas iniciadas em um notebook são executadas no mesmo pool de agendamento justo. Os trabalhos do Apache Spark gerados por gatilhos de todas as consultas de streaming em um notebook são executados um após o outro na ordem FIFO (primeiro a entrar, primeiro a sair). Isso pode causar atrasos desnecessários nas consultas, pois eles não compartilham com eficiência os recursos do cluster.
Os pools de agendador permitem declarar quais consultas de Streaming Estruturado compartilham recursos de computação.
O exemplo a seguir atribui query1 a um pool dedicado, enquanto query2 e query3 compartilha um pool de agendador.
# Run streaming query1 in scheduler pool1
spark.sparkContext.setLocalProperty("spark.scheduler.pool", "pool1")
df.writeStream.queryName("query1").toTable("table1")
# Run streaming query2 in scheduler pool2
spark.sparkContext.setLocalProperty("spark.scheduler.pool", "pool2")
df.writeStream.queryName("query2").toTable("table2")
# Run streaming query3 in scheduler pool2
spark.sparkContext.setLocalProperty("spark.scheduler.pool", "pool2")
df.writeStream.queryName("query3").toTable("table3")
Observação
A configuração da propriedade local deve estar na mesma célula do notebook em que você inicia a consulta de streaming.
Para obter mais informações sobre pools de agendadores justos do Apache, consulte a documentação do agendador justo do Apache.