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

  1. Remove the sink 'changelog-producer' option and rely on the table's setting.
  2. Or change the table to match: ALTER TABLE ... SET ('changelog-producer' = 'your-value') or recreate the table.
  3. Keep table and job configs in sync in your deployment templates to silence the mismatch.
  4. 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

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


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