apache/seatunnel · error · JobDefineCheckException

The value of the '%s' option of the (%s and %s) plugins is b

Error message

The value of the '%s' option of the (%s and %s) plugins is both '%s', and they must be different.

What it means

When building a complex multi-table DAG, fillVirtualVertices registers each plugin under its plugin_output table id. If two plugins declare the same plugin_output value, the map compute detects the collision and throws JobDefineCheckException. Each table id produced via result_table_name/plugin_output must be unique.

Source

Thrown at seatunnel-engine/seatunnel-engine-core/src/main/java/org/apache/seatunnel/engine/core/parse/ConfigParserUtil.java:182

        Map<String, Tuple2<Config, VertexStatus>> vertexStatusMap = new HashMap<>();
        fillVirtualVertices(sources, vertexStatusMap);
        fillVirtualVertices(transforms, vertexStatusMap);
        log.debug("Phase 4: Check if a non-existent vertex is used.");
        checkInputId(transforms, vertexStatusMap);
        checkInputId(sinks, vertexStatusMap);
        log.debug("Phase 5: Check if there are unused vertex.");
        checkLinked(vertexStatusMap);
    }

    private static void fillVirtualVertices(
            List<? extends Config> configs,
            Map<String, Tuple2<Config, VertexStatus>> vertexStatusMap) {
        for (Config config : configs) {
            vertexStatusMap.compute(
                    ReadonlyConfig.fromConfig(config).get(PLUGIN_OUTPUT),
                    (id, old) -> {
                        if (old != null) {
                            throw new JobDefineCheckException(
                                    String.format(
                                            "The value of the '%s' option of the (%s and %s) plugins is both '%s', and they must be different.",
                                            PLUGIN_OUTPUT.key(),
                                            config.getString(PLUGIN_NAME.key()),
                                            old._1().getString(PLUGIN_NAME.key()),
                                            id));
                        }
                        return new Tuple2<>(config, VertexStatus.CREATED);
                    });
        }
    }

    private static void checkInputId(
            List<? extends Config> configs,
            Map<String, Tuple2<Config, VertexStatus>> vertexStatusMap) {
        for (Config config : configs) {
            List<String> inputIds = getInputIds(ReadonlyConfig.fromConfig(config));
            inputIds.forEach(

View on GitHub (pinned to cf67b549a7)

Solutions

  1. Rename the plugin_output value of one of the conflicting plugins so every table id is unique
  2. Check the error message: it names both plugin names and the duplicated id
  3. If both branches need the same data, let the second consume the first via plugin_input instead of re-producing it
  4. Search the config for duplicate result_table_name/plugin_output entries

Example fix

// before
source { FakeSource { plugin_output = "t1" } }
source { Jdbc { plugin_output = "t1" } }
// after
source { FakeSource { plugin_output = "t1" } }
source { Jdbc { plugin_output = "t2" } }
Defensive patterns

Strategy: validation

Validate before calling

Set<String> outputs = new HashSet<>();
for (Config c : allPlugins) {
    if (!outputs.add(c.getString("plugin_output"))) {
        throw new IllegalArgumentException("Duplicate plugin_output: " + c.getString("plugin_output"));
    }
}

Try / catch

try {
    ConfigParserUtil.fillVirtualVertices(...);
} catch (JobDefineCheckException e) {
    log.error("Duplicate table id in DAG: {}", e.getMessage());
    throw e;
}

Prevention

When it happens

Trigger: Two source or transform plugins in one job config set the same plugin_output (or result_table_name) value; checked via checkComplexGraph during job parsing.

Common situations: Copy-pasting a source block and forgetting to rename result_table_name; two parallel branches both writing to the same intermediate table name; template-generated configs with duplicate ids.

Understand the failure class

Background: Conflicting config options: "cannot be used together" — configuration validation errors across open-source libraries — this error's family across 162 libraries.

Related errors


AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10). Data as JSON: /api/errors/3d050bca85985c09. Report an issue: GitHub.