apache/seatunnel · error · TaskExecuteException
All candidate sink tables were skipped in Spark starter.
Error message
All candidate sink tables were skipped in Spark starter.
What it means
In SinkExecuteProcessor.execute, each candidate sink table can be skipped (e.g. by save-mode policies or routing). If every candidate table ended up skipped and no sink was ever written, the processor fails fast with this error plus a formatted summary of why each table was skipped, instead of silently writing nothing.
Source
Thrown at seatunnel-core/seatunnel-spark-starter/seatunnel-spark-starter-common/src/main/java/org/apache/seatunnel/core/starter/spark/execution/SinkExecuteProcessor.java:203
MultiTableFailureHelper.mergeOptions(
ReadonlyConfig.fromConfig(sinkConfig),
ReadonlyConfig.fromConfig(
sparkRuntimeEnvironment.getConfig())),
currentSkippedTables),
classLoader);
createdAnySink = true;
String applicationId =
sparkRuntimeEnvironment.getStreamingContext().sparkContext().applicationId();
CatalogTable[] catalogTables =
datasetTableInfo.getCatalogTables().toArray(new CatalogTable[0]);
SparkSinkInjector.inject(
dataset.write(), sink, catalogTables, applicationId, parallelism)
.option("checkpointLocation", "/tmp")
.mode(SaveMode.Append)
.save();
}
if (!createdAnySink && !skippedTables.isEmpty()) {
throw new TaskExecuteException(
MultiTableFailureHelper.formatFailedTableSummary(
"All candidate sink tables were skipped in Spark starter.",
skippedTables));
}
if (createdAnySink && !skippedTables.isEmpty()) {
log.warn(
MultiTableFailureHelper.formatFailedTableSummary(
"Some sink tables were skipped in Spark starter.", skippedTables));
}
// the sink is the last stream
return null;
}
public void handleSaveMode(SeaTunnelSink sink) {
if (sink instanceof SupportSaveMode) {
Optional<SaveModeHandler> saveModeHandler =
((SupportSaveMode) sink).getSaveModeHandler();
if (saveModeHandler.isPresent()) {View on GitHub (pinned to cf67b549a7)
Solutions
- Inspect the skippedTables summary in the error to see each table's skip reason
- Fix the sink plugin_input/plugin_output routing so at least one table matches
- Check the sink's save-mode handler configuration that may be causing tables to be skipped
- Log/verify upstream transform output table names match sink expectations
Defensive patterns
Strategy: validation
Validate before calling
// Ensure sink plugin_input/plugin_output identifiers match upstream table names assert sinkConfig.pluginInputs.stream().allMatch(upstreamTables::contains);
Try / catch
try {
runSparkJob();
} catch (TaskExecuteException e) {
if (e.getMessage().contains("All candidate sink tables were skipped")) {
log.error("Sink routing misconfigured, review skippedTables summary", e);
}
} Prevention
- Verify plugin_input/plugin_output table identifiers match upstream names exactly
- Review save-mode settings that may cause tables to be skipped
- Check the skippedTables summary included in the error message
When it happens
Trigger: All tables routed to the sink were skipped (createdAnySink == false) while skippedTables is non-empty — e.g. every table hit a save-mode/skip condition or sink routing matched no writable table.
Common situations: Catalog-table routing misconfigured (plugin_input/plugin_output identifiers not matching); SaveMode policies (e.g. 'error_if_exists' filtering logic) skipping all tables; upstream produced zero matching tables so every sink candidate was dropped.
Understand the failure class
Background: EmptyResultError / "no results found": when an API or scraper succeeds but returns zero rows — this error's family across 9 libraries.
Related errors
- All candidate sink tables were skipped in Spark starter.
- Some sink tables were skipped in Spark starter.
- Skip failed sink table in Spark starter: {}
- Some sink tables were skipped in Spark starter.
- Skip failed sink table in Spark starter: {}
AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10).
Data as JSON: /api/errors/a370c8d4dab955b9.
Report an issue: GitHub.