Filament vs. OLake

Side-by-side capabilities and benchmarks.

Introduction

OLake is an open-source tool for replicating databases into a lakehouse. It reads from databases and writes to Apache Iceberg or Parquet. It is focused on that one path and does it well. Filament is an open-source replication engine that writes Iceberg too, alongside Postgres, MySQL, ClickHouse, and S3, from one binary.

HIGHLIGHTS

2.0× FASTER

ROWS PER SECOND

Filament

1,265,363 ROWS

OLake

622,056 ROWS

NYC Taxi, MySQL -> Iceberg

2.0× FASTER

ROWS PER SECOND

Filament

1,265,363 ROWS

OLake

622,056 ROWS

NYC Taxi, MySQL -> Iceberg

15.0× LESS

CPU SECONDS

Filament

528.0 SEC

OLake

7905.9 SEC

NYC Taxi, Postgres -> Iceberg

15.0× LESS

CPU SECONDS

Filament

528.0 SEC

OLake

7905.9 SEC

NYC Taxi, Postgres -> Iceberg

1.5× LESS

PEAK MEMORY

Filament

10.31 GIB

OLake

15.07 GIB

NYC Taxi, MySQL -> Iceberg

1.5× LESS

PEAK MEMORY

Filament

10.31 GIB

OLake

15.07 GIB

NYC Taxi, MySQL -> Iceberg

1.1× SLOWER

WALL TIME

Filament

234.3 SEC

OLake

204.0 SEC

NYC Taxi, Postgres -> Iceberg

1.1× SLOWER

WALL TIME

Filament

234.3 SEC

OLake

204.0 SEC

NYC Taxi, Postgres -> Iceberg

Galaxy product illustration

License and control

License

Apache 2.0, open source.

Apache 2.0, open source.

License

Apache 2.0, open source.

Apache 2.0, open source.

Self-hosted in full

Yes. One repository, no paid tier, nothing gated.

Yes. Enterprise is custom pricing by contact form with nothing publicly gated.

Self-hosted in full

Yes. One repository, no paid tier, nothing gated.

Yes. Enterprise is custom pricing by contact form with nothing publicly gated.

Adding a new source

A YAML manifest for REST APIs, loaded at runtime with no rebuild. A Go driver for databases and other driver-based sources.

Go. Implement the driver interface, about 18 methods, and build a new driver image. The UI hard-codes the allowed source types.

Adding a new source

A YAML manifest for REST APIs, loaded at runtime with no rebuild. A Go driver for databases and other driver-based sources.

Go. Implement the driver interface, about 18 methods, and build a new driver image. The UI hard-codes the allowed source types.

Connector maintenance

Every connector lives in the engine repository with a published maturity level (alpha, beta, stable).

8 sources and 2 destinations, all in the vendor monorepo.

Connector maintenance

Every connector lives in the engine repository with a published maturity level (alpha, beta, stable).

8 sources and 2 destinations, all in the vendor monorepo.

Services to operate

Server and control plane, with Postgres and NATS. Each run is its own Kubernetes Job. One binary for evaluation.

UI deployment runs 5 compose services (UI, worker, Temporal, Postgres, init) plus a container per sync. Minimum 8 vCPU and 16 GB. An external Iceberg catalog is mandatory.

Services to operate

Server and control plane, with Postgres and NATS. Each run is its own Kubernetes Job. One binary for evaluation.

UI deployment runs 5 compose services (UI, worker, Temporal, Postgres, init) plus a container per sync. Minimum 8 vCPU and 16 GB. An external Iceberg catalog is mandatory.

Runtime

Static Go binaries on distroless images. One runner code path wherever a run executes.

Go drivers plus a Java 17 sidecar JVM for every Iceberg write, talking over gRPC on localhost.

Runtime

Static Go binaries on distroless images. One runner code path wherever a run executes.

Go drivers plus a Java 17 sidecar JVM for every Iceberg write, talking over gRPC on localhost.

Scheduling

Built-in cron per pipeline. Safe to run multiple control planes.

In the UI, on Temporal. None in the CLI.

Scheduling

Built-in cron per pipeline. Safe to run multiple control planes.

In the UI, on Temporal. None in the CLI.

SaaS source execution

Manifests interpreted inside the engine, in the same process as the run. No per-connector containers.

None. Databases, Kafka, and S3 only.

SaaS source execution

Manifests interpreted inside the engine, in the same process as the run. No per-connector containers.

None. Databases, Kafka, and S3 only.

Embeddable

Yes. Go library (app.Run) with swappable event bus, state store, and secrets.

No library mode documented.

Embeddable

Yes. Go library (app.Run) with swappable event bus, state store, and secrets.

No library mode documented.

Interfaces

Web UI, ConnectRPC API, CLI.

CLI, web UI, session-cookie REST API. Single admin user, no RBAC or SSO.

Interfaces

Web UI, ConnectRPC API, CLI.

CLI, web UI, session-cookie REST API. Single admin user, no RBAC or SSO.

Correctness

Resume after failure

Mid-table, from per-shard checkpoints, for upsert, incremental, and CDC runs. A failed run lands in a partial state and continues on re-request.

Chunk-level state plus an Iceberg commit ledger in the modes that keep state. Plain full refresh writes no state and restarts.

Resume after failure

Mid-table, from per-shard checkpoints, for upsert, incremental, and CDC runs. A failed run lands in a partial state and continues on re-request.

Chunk-level state plus an Iceberg commit ledger in the modes that keep state. Plain full refresh writes no state and restarts.

Per-batch integrity check

CRC32-C computed independently on the read side and the write side of every batch. A mismatch fails the run.

None. Two-phase commit per chunk and _olake_id deduplication.

Per-batch integrity check

CRC32-C computed independently on the read side and the write side of every batch. A mismatch fails the run.

None. Two-phase commit per chunk and _olake_id deduplication.

Change data capture

Native. Postgres logical replication (pgoutput) with a consistent snapshot bootstrap. MySQL binlog with GTID cursors.

Postgres pgoutput, MySQL binlog, MongoDB change streams, SQL Server CDC tables. Oracle CDC is work in progress. Not continuous, each run is a bounded job.

Change data capture

Native. Postgres logical replication (pgoutput) with a consistent snapshot bootstrap. MySQL binlog with GTID cursors.

Postgres pgoutput, MySQL binlog, MongoDB change streams, SQL Server CDC tables. Oracle CDC is work in progress. Not continuous, each run is a bounded job.

Schema drift

New columns added to the destination automatically. Add-only, nothing dropped, nothing rewritten.

New columns added. Widening promotions applied, some narrowing accepted after range validation. Unsupported type changes such as float to int fail the sync.

Schema drift

New columns added to the destination automatically. Add-only, nothing dropped, nothing rewritten.

New columns added. Widening promotions applied, some narrowing accepted after range validation. Unsupported type changes such as float to int fail the sync.

Parallel reads within a table

Yes. Large tables split into up to 64 shards (keyset, bitmap, or ctid) read concurrently.

Yes. ctid or key-range chunks under a per-job max_threads cap that defaults to 3.

Parallel reads within a table

Yes. Large tables split into up to 64 shards (keyset, bitmap, or ctid) read concurrently.

Yes. ctid or key-range chunks under a per-job max_threads cap that defaults to 3.

Destinations

Postgres, MySQL, ClickHouse, Iceberg, S3.

Iceberg and Parquet only.

Destinations

Postgres, MySQL, ClickHouse, Iceberg, S3.

Iceberg and Parquet only.

Cost

What drives billing

Nothing. Compute you already run.

Nothing for the software. JVM sidecar memory and Temporal for the UI.

What drives billing

Nothing. Compute you already run.

Nothing for the software. JVM sidecar memory and Temporal for the UI.

Paid tiers

None.

Enterprise by contact form. No published pricing.

Paid tiers

None.

Enterprise by contact form. No published pricing.

Comparison

Benchmarks

Benchmarks

benchmark

Wall time

Seconds for a full load

Seconds for a full load

Filament

OLake

NYC Taxi, PG → Iceberg (298.3M rows)

234.3 s

204.0 s

NYC Taxi, MySQL → Iceberg (298.3M rows)

235.7 s

479.5 s

Transfer speed

Rows per second

Rows per second

Filament

Filament

OLake

OLake

Better

NYC Taxi, PG → Iceberg

NYC Taxi, PG → Iceberg

1,265,363

1,265,363

1,265,363

622,056

622,056

622,056

Filament 2.03×

NYC Taxi, MySQL → Iceberg

NYC Taxi, MySQL → Iceberg

1,265,363

1,265,363

1,265,363

622,056

622,056

622,056

Filament 2.03×

CPU seconds

Summed across containers

Summed across containers

Filament

Filament

OLake

OLake

Better

NYC Taxi, PG → Iceberg

528.0 s

528.0 s

528.0 s

7,905.9 s

7,905.9 s

7,905.9 s

Filament 15.0×

NYC Taxi, MySQL → Iceberg

940.5 s

940.5 s

940.5 s

7,465.4 s

7,465.4 s

7,465.4 s

Filament 7.9×

Peak memory

Largest container

Largest container

Filament

OLake

NYC Taxi, PG → Iceberg

11.70 GiB

16.64 GiB

NYC Taxi, MySQL → Iceberg

10.31 GiB

15.07 GiB

Last updated on August 31, 2026

Full Filament vs. OLake benchmark report

Full Filament vs. OLake benchmark report

Full Filament vs. OLake benchmark report

Migrate to

Migrate to

Copyright © 2026 Galaxy. All rights reserved.