apache/flink · error · FlinkException

Failed to trigger a savepoint for the job {}.

Error message

Failed to trigger a savepoint for the job {}.

What it means

Thrown from NestedPrimitiveColumnReader.fillColumnVector when the column's LogicalType.getTypeRoot() matches no case in the vector-materialization switch — the reader successfully decoded values but cannot build a result vector for that type root. This is the materialization-stage sibling of the read/decode switches; the message names the type.

Source

Thrown at flink-clients/src/main/java/org/apache/flink/client/cli/CliFrontend.java:876

            SavepointFormatType formatType,
            Duration clientTimeout)
            throws FlinkException {
        logAndSysout("Triggering savepoint for job " + jobId + '.');

        CompletableFuture<String> savepointPathFuture =
                clusterClient.triggerSavepoint(jobId, savepointDirectory, formatType);

        logAndSysout("Waiting for response...");

        try {
            final String savepointPath =
                    savepointPathFuture.get(clientTimeout.toMillis(), TimeUnit.MILLISECONDS);

            logAndSysout("Savepoint completed. Path: " + savepointPath);
            logAndSysout("You can resume your program from this savepoint with the run command.");
        } catch (Exception e) {
            Throwable cause = ExceptionUtils.stripExecutionException(e);
            throw new FlinkException(
                    "Failed to trigger a savepoint for the job " + jobId + ".", cause);
        }
    }

    /** Sends a SavepointTriggerMessage to the job manager in detached mode. */
    private void triggerDetachedSavepoint(
            ClusterClient<?> clusterClient,
            JobID jobId,
            String savepointDirectory,
            SavepointFormatType formatType,
            Duration clientTimeout)
            throws FlinkException {
        logAndSysout("Triggering savepoint in detached mode for job " + jobId + '.');

        try {
            final String triggerId =
                    clusterClient
                            .triggerDetachedSavepoint(jobId, savepointDirectory, formatType)

View on GitHub (pinned to 2f3c205e92)

Solutions

  1. Identify the type from the message and confirm it is absent from fillColumnVector's switch in your Flink version
  2. Avoid or transform the column: project it out, or convert the file so the nested element type is one Flink materializes (INT/DOUBLE/VARCHAR/BINARY/TIMESTAMP/DECIMAL cases)
  3. Flatten the nested structure at write time if possible
  4. Report/upgrade: this is a reader capability gap, fixed only by adding a case
Defensive patterns

Strategy: type-guard

Validate before calling

// Before the read, ensure the nested column's type root is one fillColumnVector materializes
if (!NESTED_SUPPORTED.contains(logicalType.getTypeRoot())) {
    throw new IllegalArgumentException(
        "Nested column '" + name + "' of type " + logicalType
        + " cannot be materialized by the Parquet vectorized reader");
}

Type guard

static boolean materializableNestedRoot(LogicalTypeRoot r) {
    return NESTED_SUPPORTED.contains(r) || r == LogicalTypeRoot.DECIMAL;
}

Try / catch

try {
    reader.readAndNewVector(...);
} catch (RuntimeException e) {
    if (String.valueOf(e.getMessage()).startsWith("Unsupported type in the list")) {
        failJobWithSchemaHint(schema); // deterministic schema/read mismatch
    } else throw e;
}

Prevention

When it happens

Trigger: A nested column whose type root is not in fillColumnVector's cases (e.g. TIME, DATE, BOOLEAN, or newer type roots); adding a logical type to the reader without extending fillColumnVector.

Common situations: Lists/maps of scalar types the nested reader never learned to materialize; reading files after a Flink upgrade that widened type support in some switches but not this one.

Related errors


AI-assisted analysis of apache/flink@2f3c205e92 (2026-08-14). Data as JSON: /api/errors/ac577c9a6076a412. Report an issue: GitHub.