Partilhar via


Referência do modo em tempo real

Esta página fornece informações de referência para o modo em tempo real em Structured Streaming, incluindo ambientes, línguas, fontes, sumidouros, operadores e limitações conhecidas suportadas.

Ambientes, linguagens e modos suportados

Línguas suportadas: O modo em tempo real suporta Scala, Java e Python.

Tipos de computação suportados:

Tipo de computação Suportado
Dedicado (anteriormente: usuário único)
Padrão (anteriormente: compartilhado) ✓ (apenas Python)
Lakeflow Spark Oleodutos Declarativos Classic Não suportado
Lakeflow Spark Pipelines Declarativos Sem Servidor Não suportado
Sem servidor Não suportado

Modos de execução suportados:

Modo de execução Suportado
Modo de atualização
modo de acrescento Não suportado
Modo completo Não suportado

Suporte de fonte e sumidouro

Fonte ou sumidouro Como fonte Como sumidouro
Apache Kafka
Centros de Eventos (usando conector Kafka)
Kinesis ✓ (apenas modo EFO) Não suportado
AWS MSK Não suportado
Delta Não suportado Não suportado
Google Pub/Sub Não suportado Não suportado
Apache Pulsar Não suportado Não suportado
Sumidouros arbitrários (usando forEachWriter) Não aplicável

Operadores suportados

Operadores Suportado
Operações Sem Estado
Seleção
Projeção
UDF
Scala UDF ✓ (com algumas limitações)
Python UDF ✓ (com algumas limitações)
Agregação
sum
contagem
max
min
avg
Funções de agregação
Técnica de Janelação
Tumbling
Deslizamento
Sessão Não suportado
Deduplication
dropDuplicates ✓ (o estado é ilimitado)
dropDuplicatesWithinWatermark Não suportado
Stream - Juntação de Mesa
Tabela de difusão (deverá ser pequena)
Stream - Stream Junte-se Não suportado
(plano)MapGroupsWithState Não suportado
transformWithState ✓ (com algumas diferenças)
união ✓ (com algumas limitações)
forEach
paraCadaLote Não suportado
mapPartitions Não suportado (ver limitação)

Considerações especiais

Alguns operadores e funcionalidades têm considerações ou diferenças específicas quando usados em modo em tempo real.

transformWithState em modo de tempo real

Para a criação de aplicativos baseados em estado personalizados, o Databricks suporta transformWithState, uma API no Apache Spark Structured Streaming. Consulte Criar um aplicativo com monitoração de estado personalizado para obter mais informações sobre a API e trechos de código.

No entanto, há algumas diferenças entre como a API se comporta no modo de tempo real e as consultas de streaming tradicionais que aproveitam a arquitetura de microlote.

  • O modo em tempo real chama o método handleInputRows(key: String, inputRows: Iterator[T], timerValues: TimerValues) para cada linha.
    • O inputRows iterador retorna um único valor. O modo micro-batch chama-o uma vez para cada chave, e o inputRows iterador devolve todos os valores de uma chave no micro batch.
    • Tenha em conta esta diferença ao escrever o seu código
  • Os temporizadores de tempo de evento não são suportados no modo de tempo real.
  • No modo em tempo real, os temporizadores atrasam o disparo dependendo da chegada dos dados:
    • Se um temporizador estiver agendado para as 10:00:00, mas não houver dados disponíveis, o temporizador não aciona imediatamente.
    • Se os dados chegarem às 10:00:10, o temporizador dispara com um atraso de 10 segundos.
    • Se não chegarem dados e o processo de longa duração estiver a terminar, o temporizador dispara antes do processo terminar.

UDFs em Python em modo em tempo real

O Databricks suporta a maioria das funções definidas pelo usuário (UDFs) do Python no modo em tempo real:

Categoria Tipo UDF Suportado
Sem estado Python scalar UDF (Funções escalares definidas pelo utilizador - Python)
Sem estado Seta escalar UDF
Sem estado Pandas scalar UDF (pandas funções definidas pelo utilizador)
Sem estado Função de seta (mapInArrow)
Sem estado Função Pandas (Mapa)
Agrupamento estadual (UDAF) transformWithState (Row apenas interface )
Agrupamento estadual (UDAF) applyInPandasWithState Não suportado
Agrupamento não estadual (UDAF) apply Não suportado
Agrupamento não estadual (UDAF) applyInArrow Não suportado
Agrupamento não estadual (UDAF) applyInPandas Não suportado
Função de Tabela UDTF (Funções de tabela definidas pelo utilizador em Python (UDTFs)) Não suportado
Função de Tabela UC UDF Não suportado

Há vários pontos a considerar ao usar UDFs Python no modo de tempo real:

  • Para minimizar a latência, configure o tamanho do lote Arrow (spark.sql.execution.arrow.maxRecordsPerBatch) para 1.
    • Compensação: essa configuração otimiza a latência em detrimento da taxa de transferência. Para a maioria das cargas de trabalho, essa configuração é recomendada.
    • Aumente o tamanho do lote somente se uma taxa de transferência maior for necessária para acomodar o volume de entrada, aceitando o potencial aumento na latência.
  • Pandas UDFs e funções não têm um bom desempenho com um tamanho de lote de Arrow de 1.
    • Se utilizares UDFs de pandas ou funções, define o tamanho de conjunto do Arrow para um valor mais alto (por exemplo, 100 ou superior).
    • Isto implica uma latência mais elevada. O Databricks recomenda usar um Arrow UDF ou função, se possível.
  • Devido ao problema de desempenho com pandas, transformWithState só é suportado com a interface Row.

Limitações

Limitações da fonte

Para o Kinesis, o modo em tempo real não suporta o modo de sondagem. Além disso, as repartições frequentes podem afetar negativamente a latência.

Limitações sindicais

O operador da União tem algumas limitações:

  • O modo em tempo real não suporta autounição:
    • Kafka: Não podes usar o mesmo objeto de data frame de origem e unir dataframes derivados dele. Solução alternativa: Use DataFrames diferentes que leiam da mesma fonte.
    • Kinese: Não se podem unir quadros de dados derivados da mesma fonte Kinesis com a mesma configuração. Solução alternativa: Além de usar DataFrames diferentes, pode atribuir uma opção diferente de 'Nome do consumidor' a cada DataFrame.
  • O modo em tempo real não suporta operadores com estado (por exemplo, aggregate, deduplicate, transformWithState) definidos antes da União.
  • O modo em tempo real não suporta união com fontes em lote.

Limitação do MapPartitions

mapPartitions em Scala e APIs Python semelhantes (mapInPandas, mapInArrow) pega num iterador de toda a partição de entrada e produz um iterador de toda a saída com mapeamento arbitrário entre entrada e saída. Estas APIs podem causar problemas de desempenho no Modo Real-Time de Streaming ao bloquear toda a saída, o que aumenta a latência. A semântica destas APIs não suporta bem a propagação de metadados.

Use UDFs escalares combinados com Transform tipos de dados complexos ou filter para obter funcionalidades semelhantes.