Connectors / Files & object stores

Apache Iceberg

sink

Apache Iceberg sink (append; REST/Glue/SQL/HMS catalogs)

Install

cargo install faucet-cli --features sink-iceberg
faucet init --sink iceberg
# Cargo.toml — use it as a library
cargo add faucet-sink-iceberg

Starter config

sink:
  type: iceberg
  config:
    catalog:
      type: rest    # one of: rest, glue, sql, hms
      # uri: null    # Catalog endpoint URI.
      # warehouse: null    # Object-storage warehouse root, e.g.
      # credential: null    # REST bearer token or other catalog-specific credential.
      # properties: {}    # Arbitrary catalog properties passed through to the catalog builder and the warehouse file IO (e.g.
      # --- Alternative variants — replace the block above with one of these ---
      # type: glue
      # uri: null
      # warehouse: null
      # credential: null
      # properties: {}
      #
      # type: sql
      # uri: null
      # warehouse: null
      # credential: null
      # properties: {}
      #
      # type: hms
      # uri: null
      # warehouse: null
      # credential: null
      # properties: {}
    namespace: []    # REQUIRED — Multi-part namespace that contains the target table, e.g.
    table: ""    # REQUIRED — Name of the Iceberg table (without namespace), e.g.
    # create_table: true    # Create the table if it does not exist, inferring the schema from the first batch.
    # partition_spec: []    # Partition fields applied when creating the table.
    # write_mode: null    # Write semantics for a sink.
    # target_file_size_mb: 256    # Roll over to a new Parquet data file when the estimated file size (uncompressed Arrow bytes × 0.4) exceeds this threshol…
    # parquet: { ... }    # Parquet-level compression and encoding options.
    # snapshot_properties: {}    # Key-value pairs written into the Iceberg snapshot summary.
    # batch_size: 10000    # Maximum records buffered in memory before flushing a write to the iceberg writer pipeline.
    # cleanup_orphans_on_failure: false    # Delete the Parquet data files this flush already uploaded when the snapshot commit *definitively* fails, so they do not accumulate as orphans.

Capabilities

Delivery Exactly-once (atomic watermark)
Write modes append
Exactly-once writes Yes
Schema evolution Yes
Scoped cleanup No
Staged bulk load No
Run rollback No
Compression No

Config fields

FieldTypeDefaultDescription
catalog
required
object — Iceberg catalog connection settings.
namespace
required
array — Multi-part namespace that contains the target table, e.g. ["analytics", "events"]. Must be non-empty; no segment may be empty.
table
required
string — Name of the Iceberg table (without namespace), e.g. "page_views".
create_table boolean true Create the table if it does not exist, inferring the schema from the first batch. When false, load_table is called at startup and an absent table causes a FaucetError::Sink immediately.
partition_spec array [] Partition fields applied when creating the table. Ignored on writes to an existing table (the table's existing spec is used).
write_mode object append Write semantics. Uses the shared faucet_core::WriteMode enum (append | upsert | delete). Only append is supported at runtime; non-append modes are rejected by IcebergSink::new with a FaucetError::Config. Upsert via equality-delete is tracked in #179.
target_file_size_mb integer 256 Roll over to a new Parquet data file when the estimated file size (uncompressed Arrow bytes × 0.4) exceeds this threshold.
parquet object compression: snappy Parquet codec settings.
snapshot_properties object {} Key-value pairs written into the Iceberg snapshot summary.
batch_size integer 10000 Maximum records buffered in memory before flushing a write to the iceberg writer pipeline. 0 = no limit (single batch). Default: 10 000.
cleanup_orphans_on_failure boolean false Delete the Parquet data files this flush already uploaded when the snapshot commit *definitively* fails, so they do not accumulate as orphans.
Get started

Your first pipeline runs in five minutes.

Install the CLI, scaffold a config, and move real data — nothing external to stand up.

curl -LsSf https://github.com/faucet-hq/faucet-stream/releases/latest/download/faucet-cli-installer.sh | sh
brew install faucet-hq/faucet-stream/faucet-cli