Skip to content

[EPIC] Production-grade Apache Iceberg scans #2174

Open

Description

@andygrove

Goal

Make Apache Iceberg scans a first-class Ballista workload: correct across the client, scheduler, and executors; parallel on a real cluster; efficient for large and skewed tables; and observable and testable enough to prevent performance regressions.

This supersedes the narrower request in #890 for tracking purposes. The broader policy discussion for open table formats remains in #1241.

Current status

Draft PR #2217 adds an iceberg-ballista integration with logical and physical extension codecs, table/catalog reconstruction, and distributed integration tests. It is currently blocked on upstream iceberg-datafusion work and still notes that reads are not split across executors because the scan exposes a single output partition.

Upstream work:

Workstreams

1. Integration foundation

  • Land the standalone Iceberg integration and codec support in feat: Add Iceberg Support #2217
  • Support a real scheduler with multiple executors, not only in-process execution
  • Document how to register a table/catalog and run distributed Iceberg queries
  • Keep the integration isolated from Ballista's core release/dependency graph as agreed in this issue's discussion

2. Distributed scan planning

3. Pruning and planning efficiency

  • Preserve projection and filter pushdown across Ballista plan serialization
  • Verify snapshot, manifest, partition, file, and row-group pruning with scan metrics
  • Preserve delete-file association and Iceberg correctness semantics in every partition
  • Avoid repeated manifest/file planning for equivalent scans ([iceberg-datafusion] Cache eager scan planning across equivalent scans iceberg-rust#2963)
  • Ensure metadata planning does not become a scheduler bottleneck for tables with many manifests/files

4. Correctness and resilience

  • Test partitioned and unpartitioned tables
  • Test schema evolution and time travel
  • Test position and equality deletes where supported upstream
  • Test empty scans, limits, selective filters, and scans with fewer files than target partitions
  • Test executor loss/retry without duplicate, missing, or inconsistent results
  • Keep Iceberg extension codecs composable with other Ballista extensions

5. Production object-store access

  • Support the credential flows needed by REST catalogs and vended, short-lived, or path-scoped S3 credentials; coordinate with Proposal: pluggable S3 credential providers #2532
  • Ensure credentials and catalog properties are redacted from logs and debug output
  • Exercise a REST catalog and S3-compatible object store in end-to-end tests

6. Performance and observability

  • Add reproducible multi-executor scan benchmarks covering many small files, balanced large files, skewed files, and highly selective filters
  • Compare direct DataFusion/Iceberg execution with Ballista to isolate distribution overhead
  • Report scan partitions, planned files/bytes, pruned files/bytes, manifest-planning time, and per-partition read time
  • Add a regression baseline and document expected scaling as executors are added

Acceptance criteria

This epic is complete when:

  1. A multi-file Iceberg scan fans out across multiple Ballista executors and returns the same results as direct DataFusion/Iceberg execution.
  2. Projection, filter, snapshot/time-travel, partition pruning, and delete semantics survive client-to-scheduler-to-executor plan transport.
  3. Scan task assignment is size-aware, and no single output partition becomes a major straggler solely because file sizes differ.
  4. Equivalent scans do not repeatedly perform avoidable manifest/file planning.
  5. End-to-end tests cover a REST catalog plus an S3-compatible store, including executor retry.
  6. Benchmarks and scan metrics make correctness, pruning effectiveness, planning cost, distribution, and scaling visible.
  7. User documentation provides a supported setup and a complete distributed-read example.

Non-goals

  • Making Iceberg a dependency of Ballista's core crates
  • Tracking distributed Iceberg writes in this epic, except where shared codec or correctness work is required for scans
  • Reimplementing Iceberg scan planning inside Ballista when the capability belongs in iceberg-rust / iceberg-datafusion

Background

The original request was to bring the Ballista integration proposed in apache/iceberg-rust#2613 into the Ballista ecosystem with a separate crate and release cadence. That remains the intended integration boundary.

Activity

  1. self-assigned this
    on Jul 24, 2026
  2. andygrove commented on Jul 24, 2026

    @andygrove
    MemberAuthor

    @milenkovicm I was thinking we could add a separate crate (not part of main workspace) and have independent release cycle so that it doesn't impact current Ballista release cycle

  3. milenkovicm commented on Jul 24, 2026

    @milenkovicm
    Contributor

    Same like python support, good idea

  4. NoahKusaba commented on Jul 25, 2026

    @NoahKusaba
    Contributor

    Sounds good to me. I can close my PR on iceberg-rust and re-open it here if that works with everyone?
    We can merge it in once I get the necessary iceberg-datafusion changes in.
    ** Given that the changes are tightly coupled to the Iceberg-Datafusion changes, I'm going to migrate the PR once those get merged in as it is more convenient.

  5. martin-g commented on Jul 25, 2026

    @martin-g
    Member

    +1

  6. sandugood commented on Jul 26, 2026

    @sandugood
    Contributor

    +1
    Would like to contribute and then test Ballista on my current workloads :)

  7. phillipleblanc commented on Jul 27, 2026

    @phillipleblanc
    Contributor

    This makes sense to me!

  8. NoahKusaba commented on Aug 1, 2026

    @NoahKusaba
    Contributor

    Opened the PR at
    #2217
    It's slow going getting the iceberg-datafusion changes merged in, so currently it's pointed to my iceberg-rust branch.

  9. NoahKusaba commented on Aug 5, 2026

    @NoahKusaba
    Contributor

    @andygrove can we also look to moving the iceberg-datafusion crate out of iceberg-rust? It seems their team is interested in doing so as well. Currently getting PR's merged in is an extremely slow process due to lack of reviewers.
    Not sure where it would end up living.

  10. NoahKusaba commented on Aug 10, 2026

    @NoahKusaba
    Contributor

    @andygrove
    datafusion-distributed is also looking to get iceberg-datafusion out of iceberg-rust, or to fork and maintain their own copy.
    datafusion-contrib/datafusion-distributed#533
    I think it's extremely important that we move it to datafusion-contrib, so we don't end up with a bunch of forks of this library.

  11. milenkovicm commented on Aug 12, 2026

    @milenkovicm
    Contributor

    apache/iceberg-rust#2992

    Discussion you might be interested in

  12. changed the title [-]Add Iceberg integration[/-] [+][EPIC] Production-grade Apache Iceberg scans[/+] on Oct 4, 2026
  13. NoahKusaba commented on Oct 10, 2026

    @NoahKusaba
    Contributor

    Off the top of my head, with apache/datafusion-iceberg#20 merging, nothing is blocking standalone table scans now. I'm opting to wait for apache/datafusion-iceberg#48, which is waiting on some other repo-wide refactors that are in progress, as I'll have to refactor after the fact anyway.

    I'll look to split out the standalone table-scan PR for iceberg in the coming weeks, which also sets the skeleton for table appends too.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions