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
- Rename the plugin_output value of one of the conflicting plugins so every table id is unique
- Check the error message: it names both plugin names and the duplicated id
- If both branches need the same data, let the second consume the first via plugin_input instead of re-producing it
- 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
- Enforce unique plugin_output ids across all producers
- Naming convention per plugin (e.g. <plugin>-<index>)
- Review configs after copy-paste edits
- Grep config for duplicate result_table_name/plugin_output values
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
- Source And Sink can not be null
- The '%s' option configured in [%s] is incorrect, and the sou
- The '%s' option configured is incorrect, this table(%s) belo
- The source/transform(%s) is not configured with '%s' option
- The transform/sink(%s) is not configured with '%s' option
AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10).
Data as JSON: /api/errors/3d050bca85985c09.
Report an issue: GitHub.