This pipeline stores the full event history. Database updates and deletes are kept as events; they aren’t applied as changes to the current rows in Iceberg.
Before you start
You need:- A reachable Kafka topic containing Avro records encoded with Confluent or AWS Glue Schema Registry.
- Read access to the topic, its consumer group and every schema used by the topic.
- An Iceberg catalog, warehouse and destination namespace, with permission to create and write tables.
- A non-empty string in each record’s nested
source.tablefield, naming the destination table.
Configure the pipeline in the console
1
Create a Kafka source
Enter the broker addresses, authentication, topic and starting offset, then enable Multi-schema source.
2
Select the schema registry provider
For Glue, enter Glue region, Registry name and, if required, Registry role ARN. For Confluent, enter Registry endpoint and the separate registry credentials. You don’t need to declare a fixed source schema.
3
Create an Iceberg sink
Enter the catalog, warehouse, namespace and storage settings, then enable Multi-table routing. Leave the fixed Iceberg table name and sink schema unset.
4
Create the pipeline
Review the generated pipeline query and create the pipeline. For a SQL workflow, the equivalent query is:Use the resource names you created. Keep this pipeline as a direct source-to-sink transfer.
Choose a schema registry
In API or YAML configuration, setconfig.multi_schema: true, choose schema_registry_provider, and supply schema_registry. Omit the source table’s schema. Registry-backed ingestion in this mode supports Avro. It doesn’t support JSON or Protobuf.
- AWS Glue
- Confluent
role_arn to use the deployment’s default AWS credentials. To reuse a configured MSK source role instead, remove the registry role ARN and set use_source_role: true. The reused role must have both MSK and Glue read permissions.How destination tables are selected
Records withsource.table set to orders are written to the orders table in the configured Iceberg namespace. Records with source.table set to customers are written to customers. The topic name and registry schema name don’t set the destination name.
New table names can arrive while the pipeline is running. The sink creates missing tables from the incoming data. Missing, empty, null or non-string source.table values fail ingestion, as do destination names the catalog rejects.
The complete Avro event is kept, including the Debezium before, after, source, op and timestamp fields. Kafka tombstones are skipped. Two databases that use the same source.table value share a destination table, so use separate pipelines or namespaces if those histories must stay separate.
Configuration and limits
SetmultiTable: {} on the Iceberg sink, omit tableName, and leave multiTable.tableColumn unset for this pipeline. Tables may have different schemas, but a new schema version for an existing destination must keep compatible column names, order and types. Incompatible changes fail the pipeline; automatic schema evolution isn’t supported in this mode.
- Multi-table mode is append-only. It doesn’t support primary keys or
appendOnly: false. multiTable.maxTablesdefaults to 5,000 destination tables per sink task. Exceeding the limit fails processing.- Don’t enable
inferSchema,sortColumns, indexes or evolution for this pipeline. The e6 committer-service catalog isn’t supported in multi-table mode. - If partitioning is configured, every destination’s data must contain the configured partition fields.
- Data becomes visible through successful checkpoints. More active tables and partitions increase checkpoint work.
- Kafka doesn’t guarantee record ordering across partitions.