Considerações de produção para transmissão estruturada

Este artigo contém recomendações para programar cargas de trabalho de transmissão estruturada usando o Job on Databricks.

A Databricks recomenda sempre fazer o seguinte:

  • Remova o código desnecessário dos notebooks que retornariam resultados, como display e count.

  • Não execute cargas de trabalho de transmissão estruturada usando o site compute para todos os fins. Sempre programar a transmissão como Job usando o Job compute.

  • Programar trabalho usando o modo Continuous.

  • Não habilite o dimensionamento automático para compute para o trabalho de transmissão estruturada.

Algumas cargas de trabalho se beneficiam do seguinte:

Databricks introduziu o site Delta Live Tables para reduzir as complexidades do gerenciamento da infraestrutura de produção para cargas de trabalho de transmissão estruturada. Databricks recomenda o uso do site Delta Live Tables para a nova tubulação de transmissão estruturada. Veja o que é Delta Live Tables?

Observação

O dimensionamento automático de computação tem limitações ao reduzir o tamanho do cluster para cargas de trabalho de streaming estruturado. A Databricks recomenda usar Delta Live Tables com Autoscale aprimorado para cargas de trabalho de streaming. Consulte Otimize a utilização do cluster dos pipelines do Delta Live Tables com escalonamento automático aprimorado.

Projetar cargas de trabalho de transmissão para prever falhas

Databricks recomenda sempre configurar a transmissão do Job para reiniciar automaticamente em caso de falha. Algumas funcionalidades, incluindo a evolução do esquema, pressupõem que as cargas de trabalho de transmissão estruturada estejam configuradas para tentar novamente de forma automática. Consulte Configurar transmissão estruturada Job para reiniciar as consultas de transmissão 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, o senhor deve garantir que o pipeline de processamento seja idempotente. Consulte Usar ForEachBatch para gravar em coletores de dados arbitrários.

Observação

Quando uma consulta é reiniciada, as microlotes planejadas durante os processos de execução anteriores. Se o seu trabalho falhou devido a um erro de falta de memória ou se o senhor cancelou manualmente um trabalho devido a um excesso de microlotes, talvez seja necessário escalonar o compute para processar com êxito os microlotes.

Se o senhor alterar as configurações entre as execuções, essas configurações serão aplicadas aos primeiros novos lotes planejados. Consulte Recuperação após alterações em uma consulta de transmissão estruturada.

Quando um trabalho é repetido?

O senhor pode programar várias tarefas como parte de um Databricks Job. Quando o senhor configura uma tarefa usando o acionador contínuo, não é possível definir dependências entre tarefas.

O senhor pode optar por programar várias transmissões em um único trabalho usando uma das seguintes abordagens:

  • Tarefa múltipla: Definir um trabalho com várias tarefas que executam cargas de trabalho de transmissão usando o acionador contínuo.

  • Várias consultas: Defina várias consultas de transmissão no código-fonte para uma única tarefa.

Você também pode combinar essas estratégias. A tabela a seguir compara essas abordagens.

Tarefa múltipla

Várias consultas

Como o site compute é compartilhado?

Databricks recomenda o emprego implantado compute adequadamente dimensionado para cada transmissão de tarefa. Opcionalmente, o senhor pode compartilhar o site compute entre as tarefas.

Todas as consultas compartilham o mesmo compute. O senhor pode atribuir consultas opcionais ao pool de programadores.

Como as novas tentativas são tratadas?

Todas as tarefas devem falhar antes que o trabalho tente novamente.

A tarefa tentará novamente se alguma consulta falhar.

Configurar transmissão estruturada Job para reiniciar as consultas de transmissão em caso de falha

Databricks recomenda a configuração de todas as cargas de trabalho de transmissão usando o acionador contínuo. Ver execução do trabalho continuamente.

O acionador contínuo oferece o seguinte comportamento em default:

  • Evita mais de uma execução concorrente do trabalho.

  • começar uma nova execução quando uma execução anterior falhar.

  • Usa o recuo exponencial para novas tentativas.

Databricks recomenda sempre usar o Job compute em vez do compute para todos os fins ao programar fluxo de trabalho. Em caso de falha e nova tentativa de trabalho, novo compute recurso implantado.

Observação

Você não precisa usar streamingQuery.awaitTermination() ou spark.streams.awaitAnyTermination(). Os trabalhos impedem automaticamente a conclusão de uma execução quando uma consulta de transmissão está ativa.

Usar o pool de programadores para várias consultas de transmissão

O senhor pode configurar o pool de programação para atribuir capacidade compute às consultas ao executar várias consultas de transmissão a partir do mesmo código-fonte.

Por default, todas as consultas começam em uma execução do Notebook na mesma feira programar pool. Apache Spark Trabalho gerado por acionadores de todas as consultas de transmissão em um Notebook, executado um após o outro na ordem "primeiro a entrar, primeiro a sair" (FIFO). Isso pode causar atrasos desnecessários nas consultas, pois elas não estão compartilhando eficientemente o recurso cluster.

programador pool permite que o senhor declare quais consultas de transmissão estruturada compartilham compute recurso.

O exemplo a seguir atribui query1 a um pool dedicado, enquanto query2 e query3 compartilham um programador pool.

# 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 o senhor iniciou a consulta de transmissão.

Consulte a documentação do programador justo emApache para obter mais detalhes.