You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@flink.apache.org by "Matthias Pohl (Jira)" <ji...@apache.org> on 2026/07/01 06:33:00 UTC

[jira] [Assigned] (FLINK-38697) TaskInformation blobs accumulate without cleanup causing storage exhaustion

     [ https://issues.apache.org/jira/browse/FLINK-38697?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Matthias Pohl reassigned FLINK-38697:
-------------------------------------

    Assignee:     (was: Piotr Rudnicki)

> TaskInformation blobs accumulate without cleanup causing storage exhaustion
> ---------------------------------------------------------------------------
>
>                 Key: FLINK-38697
>                 URL: https://issues.apache.org/jira/browse/FLINK-38697
>             Project: Flink
>          Issue Type: Bug
>          Components: Runtime / Coordination
>    Affects Versions: 1.14.3, 1.15.4, 1.16.3, 1.17.2, 1.18.1, 1.19.3, 1.20.3
>            Reporter: ari
>            Priority: Major
>              Labels: pull-request-available
>
> h1. Summary
> When adaptive scheduler is enabled, TaskInformation blob files accumulate on persistent storage without proper cleanup, eventually leading to storage exhaustion and job stalling.
> h1. Problem Details
> On each job deployment and restart (including JM failures), {{ExecutionJobVertex.getTaskInformationOrBlobKey() }}reconstructs TaskInformation objects from the JobGraph. These TaskInformation objects can be extremely large (>200MB) as they can contain serialized UDFs within the task configuration.
> Specifically, the Configuration field in TaskInformation includes a {{SERIALIZED_UDF}} entry.
> When these objects exceed the {{blob.offload-minsize}} configuration, they are offloaded as permanent blobs to avoid hitting RPC framesize limits. However:
>  # Blob keys are not reused across failures - each restart creates a new blob with a different key (same content hash)
>  # No cleanup mechanism until global termination - Permanent blobs are only cleaned up when the job reaches a globally terminated state (a state that doesn’t get reached during internal restarts)
>  # JobJar blobs ARE reused - In contrast, job JAR blobs stored in the JobGraph have their keys persisted and are correctly reused
>  
> h1. Impact
>  * Storage Exhaustion in storage directory (specifically a problem for high-availability storage directory since there could be hard storage limits)
>  * Job Stalling when storage limit is reached as a restart occurs but because it cant offload the blob it sends it over RPC causing it to hit the framesize limit causing checkpoints to never trigger.
>  * Particularly severe with
>  * Complex streaming jobs with large/many serialized UDFs in task config
>  * Frequent TM failures requiring restarts
>  * High parallelism (each parallelized vertex creates its on TaskInformation blob)
> h1. Reproduction Steps
>  # Enable adaptive scheduler
>  # Se {{blob.offload-minsize: 0}} (forces all TaskInformation objects to be offloaded)
>  # Run {{kubectl delete pod \{task-manager-pod-name}}} to trigger job restart
>  # Wait for job to restart and process records
>  # {{kubectl exec -it \{job-manager-pod-name} -- bash}}
>  # cd to blobstore directory and run {{ls && stat *}}
>  # Observe: Every file except the job JAR blob is duplicated after each restart
> h1. Expected vs Actual Behavior
> Expected: On a restart if content hash is the same, use the previously created task information object. However, from Flink-7140 it seems that a random key was introduced to the blob key to prevent hash-collisions. Otherwise, delete the ones that are no longer needed and then generate the new one.
> Actual: New TaskInformation blobs are created on every restart, there is no cleanup until job reaches globally terminated state, and there is unbounded blob accumulation over time



--
This message was sent by Atlassian Jira
(v8.20.10#820010)