[SQL] State-store instance metrics are shipped in every task result
Los mantenedores suelen responder en 2 días
Evaluación
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Aptitud para principiantes
- 35/100
- Tipo de issue
- Error
- Claridad
- Bastante claro
- Estado de actividad
- Activo
Línea de trabajo
Empieza con StateStoreWriter.stateStoreInstanceMetricsWithIds y setStoreInstanceMetrics, y luego sigue el manejo de los acumuladores a través de AccumulatorV2.readObject, Task.collectAccumulatorUpdates, Executor y TaskSetManager.canFetchMoreResults. Reproduce la carga de trabajo de ResultStage descrita, con un número elevado de particiones, e inspecciona los tamaños de los resultados de las tareas. La implementación terminada debería evitar que las métricas irrelevantes de instancias del state store inflen los resultados finales de las tareas, preservando al mismo tiempo las métricas de progreso requeridas del operador de estado.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Summary
Stateful operators currently create one state-store instance metric accumulator for every combination of:
state partition
x supported provider metric
x state-store name
Every task then receives and registers all of those accumulators, even though it processes only one state partition. On task completion, all external accumulators are included in the task result.
For a job with 20,000 shuffle partitions, RocksDB state, and one default store, this can result in approximately 20,000 state-instance metric updates per task.
Reproduction
A representative workload is:
spark.sql.shuffle.partitions = 20000
stateful operator using RocksDB state
checkpoint or write the stateful result
Observed behavior:
per-task result size: approximately 3 MiB
number of tasks: approximately 20,000
terminal stage: ResultStage
The cumulative task-result data can therefore be approximately 60 GiB. The job may fail with spark.driver.maxResultSize even though the actual rows are written or checkpointed by executors.
The same issue can occur with direct file writes because the final write stage is submitted through SparkContext.runJob and uses ResultTasks. Each task returns a commit result plus accumulator updates.
Root cause
Relevant code paths on master include:
StateStoreWriter.stateStoreInstanceMetricsWithIdscreates metrics for all state partitions, supported metrics, and store names.StateStoreWriter.setStoreInstanceMetricsupdates the corresponding per-instanceSQLMetric.AccumulatorV2.readObjectregisters all deserialized accumulators with the task.Task.collectAccumulatorUpdatessends all external accumulators on successful task completion.Executorserializes those accumulator updates intoDirectTaskResult.TaskSetManager.canFetchMoreResultsappliesspark.driver.maxResultSizetoResultStages.
ignoreIfUnchanged and numStateStoreInstanceMetricsToReport are applied while generating state-operator progress after the driver has received and merged the updates. They do not reduce the task-result payload.
Why checkpointing and direct writes are affected
RDD checkpoint materialization calls SparkContext.runJob, making the checkpointing stage a ResultStage.
Direct file writes also use runJob and return per-task write results or commit messages to the driver. Those task results contain the write result plus accumulator updates, so state-store metrics can contribute to the cumulative result size.
The spark.driver.maxResultSize check is not enforced for upstream ShuffleMapStages, but it is enforced for these terminal ResultStages.
Impact
This behavior causes:
- inflated task-result serialization and network traffic;
- increased executor and driver deserialization work;
- large
CompletionEventpayloads on the driver; - driver heap pressure if result processing falls behind task completion;
- possible
spark.driver.maxResultSizefailures; - increased per-task metric metadata retained by scheduler or UI structures.
Scope
This is not specific to TransformWithState. It can affect any stateful operator using StateStoreWriter and a provider that exposes state-store instance metrics.
Multiple state stores, such as those used by streaming joins, multiply the number of metrics included in each task result.
- Lenguaje dominante
- Scala
- Estrellas
- 44.3k
- Forks
- 29.5k
- Merge medio
- 8 h 43 min
- PR fusionados (30 d)
- 1
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Tiene una plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de apache/spark
-
[BUILD] Bump Ivy up to 2.6.0Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 67/100
Los mantenedores suelen responder en 2 días
-
[SQL][CONNECT] SparkConnectClient may drop metadata (auth headers) on retried/reattached RPCs if metadata is a non-list iterablePosiblemente ocupada @zainmirzaaa la tomó hace 63 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
Los mantenedores suelen responder en 2 días
-
[CORE] bug report: collision of resource profile idPosiblemente ocupada @ybapat la tomó hace 88 días. Abierto
Dificultad 1/5 Menos de una hora Aptitud para principiantes 82/100
apache/spark#57498 · 1 comentario ·
Los mantenedores suelen responder en 2 días
-
[BUILD] Drop oro dependencyAbierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
apache/spark#57209 · 7 comentarios ·
Los mantenedores suelen responder en 2 días
-
Merge spark PR script hard blocks on JIRAPosiblemente ocupada @holdenk la tomó hace 2 días. Abierto
apache/spark#59693 · 1 asignado ·
Los mantenedores suelen responder en 2 días
Todos los issues de apache/spark
Issues similares
-
PlatformSpecific.hasGreenThreads incorrectly returns false for JDK updates and non-GA versionsAbierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
apache/pekko-persistence-jdbc#646 ·
Los mantenedores suelen responder en 1 día
-
requires-triage
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
apache/datafusion-comet#7176 ·
Los mantenedores suelen responder en 1 día
-
[BUG] spark: Iceberg REST catalog symlinks collide when multiple catalogs share one REST URIAbiertokind:bug state:needs-triage
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
OpenLineage/OpenLineage#5100 · 1 comentario ·
Los mantenedores suelen responder en 4 días
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 73/100
http4s/http4s#8015 · 2 comentarios ·
Los mantenedores suelen responder en 1 día