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.
Importante
Esse recurso está em Visualização Pública.
O reparticionamento de estado sob demanda permite redimensionar o número de partições de uma consulta com estado do Streaming Estruturado sem perder o estado do ponto de verificação.
Sem o reparticionamento de estado sob demanda, você define o número de partições aleatórias durante a criação do ponto de verificação. Se você alterar spark.sql.shuffle.partitions, as consultas com pontos de verificação existentes ignorarão o novo valor. A aplicação de uma nova contagem de partições exige que você reinicie a consulta com um novo ponto de verificação.
O reparticionamento de estado sob demanda tem os seguintes benefícios:
- Ajuste as consultas redimensionando o número de partições sem recriar o ponto de verificação.
- Dimensione as consultas para cima ou para baixo para corresponder às alterações de carga de trabalho.
Requisitos
- Databricks Runtime 18 e superiores.
- A consulta deve usar o provedor de repositório de estado do RocksDB. No DBR 17.3 ou superior, o RocksDB é o provedor de repositório de estado padrão. Confira Configurar o repositório de estado do RocksDB no Azure Databricks.
Alterar o número de partições
Use a configuração do Spark spark.sql.streaming.stateStore.partitions e reinicie a consulta para alterar o número de partições aleatórias e de estado de streaming:
Python
query.stop()
spark.conf.set("spark.sql.streaming.stateStore.partitions", "<numPartitions>")
query = df.writeStream.start()
Scala
query.stop()
spark.conf.set("spark.sql.streaming.stateStore.partitions", "<numPartitions>")
val query = df.writeStream.start()
Para consultas com estado, spark.sql.streaming.stateStore.partitions tem precedência sobre spark.sql.shuffle.partitions. Depois que a consulta for reiniciada e o último microlote planejado for concluído, a consulta executará uma operação de repartição para redistribuir dados de estado no novo número de partições. Após a conclusão da operação de repartição, a consulta retomará o processamento.
Monitorar o estado de repartição
Após a conclusão do próximo microlote, os eventos StreamingQueryProgress incluem a duração da operação de repartição. Nas métricas de durationMs um evento, controlBatch.REPARTITION mostra o valor da duração em milissegundos. Tamanhos de estado maiores podem aumentar o tempo de repartição. Consulte monitoramento de consultas de streaming estruturado no Azure Databricks.
Exemplo de streaming estruturado
O exemplo a seguir reduz uma consulta de 200, o padrão, para 100 partições aleatórias. Interrompa a consulta, defina a nova contagem de partições e reinicie:
Python
# Start the query with the default partition count (200)
query = (df
.withWatermark("event_time", "10 minutes")
.groupBy(
window("event_time", "5 minutes"),
"id")
.count()
.writeStream
.format("delta")
.option("checkpointLocation", "/checkpoint/path")
.outputMode("append")
.start()
)
# Stop the query and scale down to 100 partitions
query.stop()
spark.conf.set("spark.sql.streaming.stateStore.partitions", "100")
# Restart the query with the same options
query = (df
.withWatermark("event_time", "10 minutes")
.groupBy(
window("event_time", "5 minutes"),
"id")
.count()
.writeStream
.format("delta")
.option("checkpointLocation", "/checkpoint/path")
.outputMode("append")
.start()
)
Scala
// Start the query with the default partition count (200)
val query = df
.withWatermark("event_time", "10 minutes")
.groupBy(
window($"event_time", "5 minutes"),
$"id")
.count()
.writeStream
.format("delta")
.option("checkpointLocation", "/checkpoint/path")
.outputMode("append")
.start()
// Stop the query and scale down to 100 partitions
query.stop()
spark.conf.set("spark.sql.streaming.stateStore.partitions", "100")
// Restart the query with the same options
val query2 = df
.withWatermark("event_time", "10 minutes")
.groupBy(
window($"event_time", "5 minutes"),
$"id")
.count()
.writeStream
.format("delta")
.option("checkpointLocation", "/checkpoint/path")
.outputMode("append")
.start()
Exemplo de pipelines do Lakeflow
Em pipelines do Lakeflow, defina spark.sql.streaming.stateStore.partitions usando o parâmetro spark_conf no decorador @dp.table ou @dp.append_flow.
Defina partições em um fluxo:
from pyspark import pipelines as dp
from pyspark.sql import functions as F
source_path = "/databricks-datasets/iot-stream/data-device/"
dp.create_streaming_table("target_table")
@dp.append_flow(
target="target_table",
name="my_flow_1",
spark_conf={"spark.sql.streaming.stateStore.partitions": "100"}
)
def my_flow_1():
return (spark.readStream.format("cloudFiles")
.option("cloudFiles.format", "json")
.load(source_path)
.withColumn("timestamp", F.to_timestamp("timestamp"))
.withWatermark("timestamp", "10 minutes")
.groupBy(F.window("timestamp", "5 minutes"), "id")
.count())
Defina partições no nível da tabela para o fluxo padrão:
from pyspark import pipelines as dp
from pyspark.sql import functions as F
source_path = "/databricks-datasets/iot-stream/data-device/"
@dp.table(
name="table_1",
spark_conf={"spark.sql.streaming.stateStore.partitions": "100"}
)
def table_1():
return (spark.readStream.format("cloudFiles")
.option("cloudFiles.format", "json")
.load(source_path)
.withColumn("timestamp", F.to_timestamp("timestamp"))
.withWatermark("timestamp", "10 minutes")
.groupBy(F.window("timestamp", "5 minutes"), "id")
.count())