apache/seatunnel · warning
configured the props named 'changelog-producer' which is not
Error message
configured the props named 'changelog-producer' which is not compatible with the options in table , so it will use the table's 'changelog-producer'
What it means
PaimonSinkWriter compares the 'changelog-producer' value configured in the sink options against the one already set on the target Paimon table. When both are present and differ, the table's setting wins; this warning tells you your sink-level option was ignored.
Source
Thrown at seatunnel-connectors-v2/connector-paimon/src/main/java/org/apache/seatunnel/connectors/seatunnel/paimon/sink/PaimonSinkWriter.java:146
Table paimonFileStoretable,
String commitUser,
JobContext jobContext,
PaimonSinkConfig paimonSinkConfig,
PaimonHadoopConfiguration paimonHadoopConfiguration,
PaimonBucketAssignerFactory paimonBucketAssignerFactory) {
this.sourceTableSchema = catalogTable.getTableSchema();
this.seaTunnelRowType = this.sourceTableSchema.toPhysicalRowDataType();
this.jobContext = jobContext;
this.paimonTablePath = catalogTable.getTablePath();
this.paimonCatalog = PaimonCatalog.loadPaimonCatalog(readonlyConfig);
this.paimonCatalog.open();
this.paimonTable = (FileStoreTable) paimonFileStoretable;
this.commitUser = commitUser;
CoreOptions.ChangelogProducer changelogProducer =
this.paimonTable.coreOptions().changelogProducer();
if (Objects.nonNull(paimonSinkConfig.getChangelogProducer())
&& changelogProducer != paimonSinkConfig.getChangelogProducer()) {
log.warn(
"configured the props named 'changelog-producer' which is not compatible with the options in table , so it will use the table's 'changelog-producer'");
}
this.rowAssignerChannelComputer =
new RowAssignerChannelComputer(
paimonTable.schema(), context.getNumberOfParallelSubtasks());
rowAssignerChannelComputer.setup(context.getNumberOfParallelSubtasks());
this.paimonBucketAssignerFactory = paimonBucketAssignerFactory;
this.parallelism = context.getNumberOfParallelSubtasks();
this.taskIndex = context.getIndexOfSubtask();
this.paimonSinkConfig = paimonSinkConfig;
this.sinkPaimonTableSchema = this.paimonTable.schema();
this.ioManager =
(IOManagerImpl)
IOManager.create(splitPaths(paimonSinkConfig.getChangelogTmpPath()));
this.newTableWrite();
BucketMode bucketMode = this.paimonTable.bucketMode();
// https://paimon.apache.org/docs/master/primary-key-table/data-distribution/#dynamic-bucket
// When you need cross partition upsert (primary keys not contain all partition fields),View on GitHub (pinned to cf67b549a7)
Solutions
- Remove the sink 'changelog-producer' option and rely on the table's setting.
- Or change the table to match: ALTER TABLE ... SET ('changelog-producer' = 'your-value') or recreate the table.
- Keep table and job configs in sync in your deployment templates to silence the mismatch.
- Only proceed ignoring it if the table's value is the intended one — otherwise the write path may lack the changelog you expect.
Example fix
// before
sink { Paimon { changelog-producer = input ... } } // table has changelog-producer = none
// after
ALTER TABLE my_table SET ('changelog-producer' = 'input');
// or delete the line from the sink config Defensive patterns
Strategy: validation
Validate before calling
String tableProducer = tableOptions.get("changelog-producer");
String sinkProducer = sinkConfig.getChangelogProducer();
if (tableProducer != null && sinkProducer != null && !tableProducer.equals(sinkProducer)) throw new IllegalStateException("changelog-producer mismatch"); Prevention
- Keep table options and sink config generated from one source of truth
- Drop sink-level changelog-producer unless overriding intentionally
- Review table DDL after schema drift
When it happens
Trigger: PaimonSinkWriter constructor with a PaimonSinkConfig that has changelogProducer non-null while the existing FileStoreTable's CoreOptions.changelogProducer() returns a different enum value.
Common situations: Job config says 'input' or 'lookup' but the table was created with 'none' or 'full-compaction'; ALTER of table options after job config was written; reusing a copy-pasted sink config across tables with different changelog producers.
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
- System or JVM property '<property>' is already defined, but
- System or JVM property '${property}' is already defined, but
- WRITE_PROPS_BUCKET_KEY_ERROR
- The value of${key} is required
- ${key} is required
AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10).
Data as JSON: /api/errors/9b970074b28be7aa.
Report an issue: GitHub.