{"record":{"id":"889dd60a53f5899a","repo":"apache/seatunnel","slug":"some-sink-tables-were-skipped-in-spark-starter-889dd6","errorCode":null,"errorMessage":"Some sink tables were skipped in Spark starter.","messagePattern":"Some sink tables were skipped in Spark starter\\.","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"seatunnel-core/seatunnel-spark-starter/seatunnel-spark-starter-common/src/main/java/org/apache/seatunnel/core/starter/spark/execution/SinkExecuteProcessor.java","lineNumber":209,"sourceCode":"            createdAnySink = true;\n            String applicationId =\n                    sparkRuntimeEnvironment.getStreamingContext().sparkContext().applicationId();\n            CatalogTable[] catalogTables =\n                    datasetTableInfo.getCatalogTables().toArray(new CatalogTable[0]);\n            SparkSinkInjector.inject(\n                            dataset.write(), sink, catalogTables, applicationId, parallelism)\n                    .option(\"checkpointLocation\", \"/tmp\")\n                    .mode(SaveMode.Append)\n                    .save();\n        }\n        if (!createdAnySink && !skippedTables.isEmpty()) {\n            throw new TaskExecuteException(\n                    MultiTableFailureHelper.formatFailedTableSummary(\n                            \"All candidate sink tables were skipped in Spark starter.\",\n                            skippedTables));\n        }\n        if (createdAnySink && !skippedTables.isEmpty()) {\n            log.warn(\n                    MultiTableFailureHelper.formatFailedTableSummary(\n                            \"Some sink tables were skipped in Spark starter.\", skippedTables));\n        }\n        // the sink is the last stream\n        return null;\n    }\n\n    public void handleSaveMode(SeaTunnelSink sink) {\n        if (sink instanceof SupportSaveMode) {\n            Optional<SaveModeHandler> saveModeHandler =\n                    ((SupportSaveMode) sink).getSaveModeHandler();\n            if (saveModeHandler.isPresent()) {\n                try (SaveModeHandler handler = saveModeHandler.get()) {\n                    handler.open();\n                    new SaveModeExecuteWrapper(handler).execute();\n                } catch (Exception e) {\n                    throw new SeaTunnelRuntimeException(HANDLE_SAVE_MODE_FAILED, e);\n                }","sourceCodeStart":191,"sourceCodeEnd":227,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-core/seatunnel-spark-starter/seatunnel-spark-starter-common/src/main/java/org/apache/seatunnel/core/starter/spark/execution/SinkExecuteProcessor.java#L191-L227","documentation":"SinkExecuteProcessor in the Spark starter tracks tables that could not have a sink created (skippedTables) when building a multi-table sink pipeline. When only some tables were skipped, the job proceeds but this warning is logged listing each failed table, phase, plugin name, and the underlying error. It tells the developer that the submitted job will not write to every configured sink table.","triggerScenarios":"Executing a Spark job with multiple sink tables where creating/initializing the sink for one or more tables throws (bad table path, unsupported plugin per table, schema mismatch) while at least one sink was created successfully so the job continues.","commonSituations":"Multi-table configs where one target table was dropped or renamed, a sink plugin misconfigured for one database, or a schema drift making one target incompatible while other targets remain valid.","solutions":["Read the warn log's per-table summary to identify which table path/plugin/phase failed and fix that table's config.","Verify each sink table path exists and the sink plugin supports it in the Spark execution engine.","Re-run a batch with only the failing table to isolate the root error.","If skipping is unacceptable, check the multi-table skip/fail configuration option so failures abort the job instead of skipping."],"exampleFix":"// before: one table path wrong among several\nsink {\n  Jdbc {\n    source_table_name = \"t1\"\n    database = \"prod\"\n  }\n}\n// after: correct the path/plugin for the skipped table\nsink {\n  Jdbc {\n    source_table_name = \"t1\"\n    database = \"prod\"\n    table = \"orders\"   // ensure target table exists and plugin supports it\n  }\n}","handlingStrategy":"validation","validationCode":"// Before submitting, validate each sink table path and plugin\nsinkConfigs.forEach(cfg -> {\n    String table = cfg.getString(\"source_table_name\");\n    if (!upstreamTables.contains(table)) {\n        throw new IllegalArgumentException(\"Sink references unknown table: \" + table);\n    }\n});","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Dry-run multi-table configs with fail-fast mode to surface per-table problems early.","Keep sink table paths in version control and validate them in CI.","Always read the full warn summary; it lists every skipped table with its phase and cause."],"tags":["spark","sink","multi-table","partial-failure"],"backgroundTag":"schema-validation-failed","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}