Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
99 commits
Select commit Hold shift + click to select a range
821bc3f
Add DistributedPlanError::NonDistributable and do not distribute SHOW…
gabotechs Oct 17, 2025
9241841
implement distributed EXPLAIN ANALYZE
jayshrivastava Oct 9, 2025
23d640a
display: use range to represent partitions in a task (#194)
jayshrivastava Oct 17, 2025
f177452
Refactor distributed planner into its own folder (#196)
gabotechs Oct 22, 2025
a94a214
Fix issue in distributed_codec (#200)
gabotechs Oct 22, 2025
4ead8f1
Add dynamic task config based on DataFusion extension options (#197)
gabotechs Oct 22, 2025
df78006
Add arrow flight endpoint hooks (#198)
gabotechs Oct 22, 2025
01b0866
Rollback plan dependent usize (#201)
gabotechs Oct 23, 2025
3d3609c
metrics: make MetricsWrapperExec transparent
jayshrivastava Oct 23, 2025
a2dd7ee
Return input task count in NetworkBoundary (#204)
gabotechs Oct 27, 2025
2f29bd1
remove schema adapter (#205)
adriangb Oct 27, 2025
6f69516
allow configuring message sizes (#207)
adriangb Oct 27, 2025
1bc4841
Adds test ensuring dictionary corruption does not occur anymore (#208)
marc-pydantic Oct 29, 2025
dbf80f9
Struct is public only within crate. (#210)
JSOD11 Oct 31, 2025
c3ef7b8
Create stage key constructor.
JSOD11 Oct 31, 2025
1a3fe1c
Add comment.
JSOD11 Nov 1, 2025
137fbd7
Update Readme with working git-lfs instructions (#212)
JSOD11 Nov 4, 2025
bee1a8f
Add testing for distributed codec (#217)
JSOD11 Nov 7, 2025
dd853a7
fix(datafusion-distributed): relax ttl map timing constraints (#218)
JSOD11 Nov 14, 2025
731ad2a
Rework task assignation mechanism (#216)
gabotechs Nov 14, 2025
8a2428b
fix(ttl_map): two minor fixes for ttl_map configuration parsing (#225)
ruchirK Nov 18, 2025
28a278c
fix(ttl_map): initialize time to 1 for correct wrapping sub (#224)
ruchirK Nov 19, 2025
6b66c22
Add AWS CDK-based benchmarking environment (#227)
gabotechs Nov 19, 2025
83efd9e
Improve TPCH gen command (#230)
gabotechs Nov 19, 2025
ba3e1dc
free up disk space in CI runners (#234)
jayshrivastava Nov 21, 2025
a8952c7
Split TPCH tests in correctness, planning and explain analyze (#232)
gabotechs Nov 21, 2025
fa8b1c2
Upgrade to DF v51 (#236)
ahmed-mez Nov 21, 2025
4867a18
Upgrade benchmarks to v51 (#238)
ahmed-mez Nov 21, 2025
44633c9
Faster CDK deploys (#241)
gabotechs Nov 27, 2025
f6dfaa6
Add batch coalescing in NetworkShuffleExec operations (#242)
gabotechs Nov 27, 2025
ce5218b
add tpc-ds tests and property-based testing utilities (#231)
jayshrivastava Dec 4, 2025
99ab70b
Add failing option extension propagation test (#246)
gabotechs Dec 5, 2025
3262025
Add Trino to CDK benchmarks (#244)
gabotechs Dec 8, 2025
94c5d77
Fix network boundary deadlocks (#240)
gabotechs Dec 8, 2025
97a9809
Fix build (#249)
gabotechs Dec 9, 2025
f669d97
Collect metrics optionally (#245)
gabotechs Dec 14, 2025
8e1792a
Rework integration tests for not constructing the plans manually (#257)
gabotechs Dec 18, 2025
5dbdf00
Add failing test for UNIONs in the distributed planner (#258)
gabotechs Dec 18, 2025
b7e12af
Add Sphinx-based docs (#254)
gabotechs Dec 19, 2025
e56530a
Tailor examples and docs
gabotechs Dec 19, 2025
f3035ef
Update README.md
gabotechs Dec 19, 2025
f752f66
Update README.md
gabotechs Dec 19, 2025
529d75b
Update docs
gabotechs Dec 19, 2025
0a45a78
Fix docs
gabotechs Dec 19, 2025
625044c
Add Distributed DataFusion cli (#261)
gabotechs Dec 22, 2025
7636da1
Rework distributed planning logic (#259)
gabotechs Dec 24, 2025
d110b81
Bump arrow version (#268)
gabotechs Dec 24, 2025
b7e5555
Make queries in TPC-DS get distributed (#264)
gabotechs Dec 26, 2025
a02666a
Split channel resolver in two (#265)
gabotechs Dec 29, 2025
69da7db
Refactor benchmarks crate and add TPC-DS benchmarks (#269)
gabotechs Dec 29, 2025
831d617
Add Clickbench tests and benchmarks (#270)
gabotechs Dec 29, 2025
a94556a
Distribute UNION operations (#262)
gabotechs Dec 29, 2025
a4b0b5a
Update missing documentation (#266)
gabotechs Dec 29, 2025
84243d3
Apply TaskEstimator on all nodes (#271)
gabotechs Dec 29, 2025
f7318aa
Rename all arrow flight endpoint references to "Worker" (#274)
gabotechs Dec 30, 2025
48910a6
Improve default task estimator (#275)
gabotechs Jan 2, 2026
1fb4daa
Adapt remote benchmarks to support more datasets (#276)
gabotechs Jan 2, 2026
9509b85
Improve docs and add custom execution plan example (#277)
gabotechs Jan 6, 2026
086b89f
Add ballista to benchmarks (#278)
gabotechs Jan 6, 2026
a89de5f
Add Spark to remote benchmarks (#280)
gabotechs Jan 7, 2026
a938440
Doc fixes (#288)
JSOD11 Jan 12, 2026
057b9e5
add binary executable crate for observability tool (#290)
EdsonPetry Jan 13, 2026
73de134
Identify benchmark queries as arbitrary strings (#282)
gabotechs Jan 13, 2026
d4212bb
Worker network stream optimizations (#283)
gabotechs Jan 14, 2026
d37bf1f
Remove ballista from benchmarks (#292)
gabotechs Jan 14, 2026
9707b00
Move forward to datafusion 52 (#291)
marc-pydantic Jan 15, 2026
bfe9a82
Fix header extension propagation (#298)
gabotechs Jan 20, 2026
50f2580
Replace explain_analyze.rs tests with more scoped metrics_collection.…
gabotechs Jan 20, 2026
32c4529
Allow sending compressed data over the wire (#301)
gabotechs Jan 20, 2026
15c5f7a
Add new `batch_coalescing_below_network_boundaries` optimization pass…
gabotechs Jan 21, 2026
deb53e9
Distributed hive-style join testing with superset satisfaction (#256)
JSOD11 Jan 22, 2026
056e689
Support OutputBytes, OutputBatches, PruningMetrics, and Ratio metrics…
jayshrivastava Jan 22, 2026
2473ac3
Clippy fixes (#303)
JSOD11 Jan 23, 2026
09c8547
Gene.bordegaray/2025/12/add broadcast exec (#279)
gene-bordegaray Jan 23, 2026
e33b14c
Add metrics to network boundaries (#306)
gabotechs Jan 26, 2026
7ea1c77
Misc improvements for benchmarks (#300)
gabotechs Jan 26, 2026
b2261bf
Add functionality for worker-console communication (#297)
EdsonPetry Jan 26, 2026
394a521
Optionally display metrics per task (version 2) (#309)
jayshrivastava Jan 26, 2026
7660410
Add fast deploys (#315)
gabotechs Jan 26, 2026
9e6e85d
Fix proto generation script `out_dir` path (#317)
EdsonPetry Jan 27, 2026
971dfab
Fix metrics collection bug: preserve PartitionIsolatorExec in plan (#…
jayshrivastava Jan 27, 2026
5d3eeae
Change remote cluster benchmark instances to c5n.2xlarge (#321)
gabotechs Jan 27, 2026
c264740
Handle stream cancellations gracefully (#320)
gabotechs Jan 27, 2026
a17bac7
Branch name in benchmarks (#325)
gabotechs Jan 28, 2026
9115660
fix bench data generation and docs (#327)
gene-bordegaray Jan 28, 2026
1e14d1a
Put arrow back to 57.1.0 (#329)
gabotechs Jan 29, 2026
f2ef576
fix: metrics displaying on new line (#328)
jayshrivastava Jan 29, 2026
fecd75b
Update README.md (#334)
gabotechs Feb 2, 2026
30002e8
Replace TTL Map with moka async cache (#339)
EdsonPetry Feb 3, 2026
1a8f530
Fix metrics display on leaf nodes (#336)
gabotechs Feb 3, 2026
7f6a60e
feat: Support multiple output tasks from NetworkCoalesceExec (#323)
gabrielkerr Feb 3, 2026
7b9cd42
add `network_latency_*` metrics for network* nodes (#322)
jayshrivastava Feb 4, 2026
dda54ee
Add shuffle batch size to distributed config (#332)
gabotechs Feb 5, 2026
67c2379
feat: Add support for passthrough headers to worker nodes (#340)
geoffreyclaude Feb 5, 2026
9358ca8
Gene.bordegaray/2026/01/improve broadcast cache (#324)
gene-bordegaray Feb 6, 2026
0ac06d1
Claude Skill for benchmarks (#337)
gabotechs Feb 9, 2026
47e132e
test: reproduce metrics loss on early stream termination (#341)
gferrate Feb 9, 2026
4794fc1
Adapt codebase for DataDog
gabotechs Feb 10, 2026
f93218f
Update DataFusion to PR85 head and fix proto converter args
gene-bordegaray Feb 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
62 changes: 62 additions & 0 deletions .claude/skills/ec2-cluster-provision/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
---
name: ec2-cluster-provision
description: uses the code present in this repository for provision an EC2 cluster for benchmarking purposes
---

This project uses a remote benchmarks EC2 cluster constructed with AWS CDK located at `benchmarks/cdk`.

There's a package.json file in `benchmarks/cdk/package.json` with relevant commands about deploying.

All the commands in this skill need to be prefixed with whatever the user declared in `./claude/settings.local.json`
in the `aws-commands-prefix` key, typically for providing the commands with the correct permissions.
(e.g., `$aws-commands-prefix npm run cdk deploy` or `$aws-commands-prexfix aws ssm ...`)

Running `npm run cdk deploy` will provision the cluster with the resources specified in `benchmarks/cdk/lib/`.
This takes a while typically (~5 mins). If the user data of the EC2 machines was changed, and you want those changes
to take effect you will need to prepend the deployment command with `USER_DATA_CAUSES_REPLACEMENT=true`.

Once the deployment is complete, the list of instance IDs will be printed to stdout.

It's usually necessary to verify that everything was deployed correctly, and it's running fine. For that
it's necessary to perform the following steps for the following engines:

## Distributed DataFusion

1. Port forward the 9000 port in a background terminal:
`aws ssm start-session --target $INSTANCE_ID --document-name AWS-StartPortForwardingSession --parameters "portNumber=9000,localPortNumber=9000"`
2. Issue a command to /info to see what was deployed:
`curl http://localhost:9000/info | jq .`
3. If everything's fine, you should see the list of listening workers and the build time

## Trino

1. Port forward the 8080 port in a background terminal:
`aws ssm start-session --target $INSTANCE_ID --document-name AWS-StartPortForwardingSession --parameters "portNumber=8080,localPortNumber=8080"`
2. Issue a command to /v1/node to see what nodes are available for listening:
`curl -s -H "X-Trino-User: admin" http://localhost:8080/v1/node | jq .`
`curl -s -H "X-Trino-User: admin" http://localhost:8080/v1/info | jq .`
3. Make sure that the response of the above is consistent with what is supposed to be deployed by
`benchmarks/cdk/lib/trino.ts`

## Spark

1. Port forward the 9003 port in a background terminal (this is a custom Python server `benchmarks/cdk/bin/spark_http.py`):
`aws ssm start-session --target $INSTANCE_ID --document-name AWS-StartPortForwardingSession --parameters "portNumber=9003,localPortNumber=9003"`
2. You can issue curl queries to `http://localhost:9003/health` and `http://localhost:9003/query` to double-check that
everything is consistent with what's expected from `benchmarks/cdk/lib/spark.ts`

## Ballista

1. Port forward the 9002 port in a background terminal:
`aws ssm start-session --target $INSTANCE_ID --document-name AWS-StartPortForwardingSession --parameters "portNumber=9002,localPortNumber=9002"`
2. Verify that there are in fact the expected workers connected to the scheduler. For this, all workers need to
have the appropriate instance IP configured in their launch command, which might not have been done by default,
because this happens in a post cloud-init command that might not run because of timeout.
3. Verify with systemctl in each remote machine that all workers are running successfully. One thing that happens
very often is that `--external-host` is incorrectly set to localhost rather than the actual scheduler EC2 private IP

Remember that for running port forward commands in the background, they take like 5 secs until the
"waiting for connections" message appears. Until then, the port is still not forwarded.

If at some point you need to run a command in all machines and get its output, you can do it
with `npm run send-command your custom command`
85 changes: 85 additions & 0 deletions .claude/skills/remote-benchmark/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
---
name: remote-benchmark
description: deploys the code to a remote EC2 cluster with the commands available in the package.json, port-forwards
a machine port, and runs benchmarks against it.
---

This project uses a remote benchmarks EC2 cluster constructed with AWS CDK located at `benchmarks/cdk`.

There's a package.json file in `benchmarks/cdk/package.json` with relevant commands about benchmarking.

All the commands in this skill need to be prefixed with whatever the user declared in `./claude/settings.local.json`
in the `aws-commands-prefix` key, typically for providing the commands with the correct permissions.
(e.g., `$aws-commands-prefix npm run fast-deploy` or `$aws-commands-prexfix aws ssm ...`)

You can assume that the cluster is already there, and the only thing necessary is to execute the `npm run fast-deploy`
command for deploying the current code to the EC2 cluster. Remember that all npm commands need to be run from the
`benchmarks/cdk` folder.

The `npm run fast-deploy` command will compile the current code and deploy it to the EC2 machines. If it fails,
prompt the user to fix it. It will output several EC2 instance IDs: pick the first one, that's the one we will port
forward locally in order to issue queries to it.

Once the deployment is completed, port forward the first instance id to the local port 9000:

```shell
aws ssm start-session --target i-0000000000000 --document-name AWS-StartPortForwardingSession --parameters "portNumber=9000,localPortNumber=9000"
```

Remember to run that in the background, as that will block in place.

Once the port is correctly listening locally (you will see a "waiting for connections" message), it's fine to start
the benchmarks.

You can start the benchmarks with `npm run datafusion-bench`, you can learn how this command works by running:

```shell
$ npm run datafusion-bench -- --help

Usage: datafusion-bench [options]

Options:
--dataset <string> Dataset to run queries on
-i, --iterations <number> Number of iterations (default: "3")
--bytes-processed-per-partition <number> How many bytes each partition is expected to process (default: "134217728")
--batch-size <number> Standard Batch coalescing size (number of rows) (default: "32768")
--shuffle-batch-size <number> Shuffle batch coalescing size (number of rows) (default: "32768")
--children-isolator-unions <number> Use children isolator unions (default: "true")
--broadcast-joins <boolean> Use broadcast joins (default: "false")
--collect-metrics <boolean> Propagates metric collection (default: "true")
--compression <string> Compression algo to use within workers (lz4, zstd, none) (default: "lz4")
--queries <string> Specific queries to run
--debug <boolean> Print the generated plans to stdout
-h, --help display help for command
```

The --dataset command is mandatory, and its value can be any of the folder names in `benchmarks/data`, for example:
clickbench_0-100, tpcds_sf1, tpch_sf1, tpch_sf10 or tpch_sf100.

Also, the --queries argument can be used for executing just a partial subset of queries, for example:
```shell
--queries q1,q2,q3
```

When benchmarking a very specific feature, it's convenient to choose wisely a relevant query and just execute that one.

The user provided the following arguments: $ARGUMENTS

parse those and make sure you parse them correctly, for example `tpch_sf100 q1,q2,q4` means
`--dataset tpch_sf100 --queries q1,q2,q4`. Note that the user might also give natural language instructions in the
arguments, be smart while parsing those.

### analyzing results

results for individual queries will be dumped in the respective dataset folders, for example:

`benchmarks/data/tpch_sf10/.results-remote/datafusion-distributed-main/q1.json`
or
`benchmarks/data/tpch_sf1/.results-remote/datafusion-distributed-new-branch/q2.json`

You can inspect the results and the plan by reading the JSONs. Tip: use jq for printing nice results.

As the results of previous branches are already stored in disk, they usually can be analyzed without re-running them
again, that can be done by either:
- Just looking at the latencies and plans in the output folders.
- Running the `npm run datafusion-bench -- compare --dataset tpch_sfX datafusion-distributed-<base branch> datafusion-distributed-<compare branch>`
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
*.parquet filter=lfs diff=lfs merge=lfs -text
*.png filter=lfs diff=lfs merge=lfs -text
4 changes: 4 additions & 0 deletions .github/actions/setup/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ inputs:
runs:
using: 'composite'
steps:
- name: Free up disk space
shell: bash
run: ${{ github.action_path }}/free_disk_space.sh
- shell: bash
run: |
echo $HOME
Expand All @@ -26,3 +29,4 @@ runs:
- uses: Swatinem/rust-cache@v2
with:
key: ${{ runner.os }}-${{ inputs.targets }}-rust-cache
prefix-key: v1-rust
24 changes: 24 additions & 0 deletions .github/actions/setup/free_disk_space.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#!/bin/bash

# Script to free up disk space on CI systems
# Source: https://github.com/apache/flink/blob/02d30ace69dc18555a5085eccf70ee884e73a16e/tools/azure-pipelines/free_disk_space.sh

echo "Freeing up disk space on CI system"

echo "Listing 100 largest packages"
dpkg-query -Wf '${Installed-Size}\t${Package}\n' | sort -n | tail -n 100
df -h

echo "Removing large packages"
sudo apt-get remove -y '^ghc-8.*'
sudo apt-get remove -y '^dotnet-.*'
sudo apt-get remove -y '^llvm-.*'
sudo apt-get remove -y 'php.*'
sudo apt-get remove -y azure-cli google-cloud-sdk hhvm google-chrome-stable firefox powershell mono-devel
sudo apt-get autoremove -y
sudo apt-get clean
df -h

echo "Removing large directories"
rm -rf /usr/share/dotnet/
df -h
34 changes: 32 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,20 +9,28 @@ on:
env:
CARGO_TERM_COLOR: always
RUST_BACKTRACE: 1
TPCDS_SCALE_FACTOR: 0.5 # 0.5 scale factor produces a data dir which is 124MB

concurrency:
group: ${{ github.ref }}
cancel-in-progress: true

jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup
- run: cargo build

clippy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup
with:
components: clippy
- run: cargo clippy --all-targets --features integration
- run: cargo clippy --all-targets --all-features -- -D warnings

unit-test:
runs-on: ubuntu-latest
Expand All @@ -38,7 +46,29 @@ jobs:
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup
- run: cargo test --features tpch --test tpch_validation_test
- run: cargo test --features tpch --test 'tpch_*'

tpcds-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup
- uses: actions/cache@v4
with:
path: testdata/tpcds/main.zip
key: "main.zip"
- run: cargo test --features tpcds --test 'tpcds_*'

clickbench-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup
- uses: actions/cache@v4
with:
path: testdata/clickbench/
key: "data"
- run: cargo test --features clickbench --test 'clickbench_*'

format-check:
runs-on: ubuntu-latest
Expand Down
55 changes: 55 additions & 0 deletions .github/workflows/docs.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
name: Deploy Documentation

on:
push:
branches:
- main
workflow_dispatch:

permissions:
contents: read
pages: write
id-token: write

concurrency:
group: "pages"
cancel-in-progress: false

jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
lfs: true

- name: Setup Python
uses: actions/setup-python@v6
with:
python-version: '3.x'

- name: Install dependencies
run: |
pip install -r docs/requirements.txt

- name: Build documentation
run: |
cd docs
make html

- name: Upload artifact
uses: actions/upload-pages-artifact@v4
with:
path: docs/build/html

deploy:
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
needs: build
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
10 changes: 9 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,12 @@
/.idea
/target
/benchmarks/data/
testdata/tpch/data/
testdata/tpch/*
!testdata/tpch/queries
testdata/tpcds/*
!testdata/tpcds/queries
!testdata/tpcds/README.md
testdata/clickbench/*
!testdata/clickbench/queries
src/observability/gen/target/*
src/observability/gen/Cargo.lock
Loading
Loading