You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@datafusion.apache.org by gi...@apache.org on 2026/07/24 21:14:24 UTC

(datafusion-ballista) branch asf-site updated: Publish built docs triggered by 561037c7bb218d1964f16c36be8f81cd95f6c50c

This is an automated email from the ASF dual-hosted git repository.

github-actions[bot] pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/datafusion-ballista.git


The following commit(s) were added to refs/heads/asf-site by this push:
     new 0ebd46e9d Publish built docs triggered by 561037c7bb218d1964f16c36be8f81cd95f6c50c
0ebd46e9d is described below

commit 0ebd46e9d84512c6b8ef310f4fd6640361d42f27
Author: github-actions[bot] <gi...@users.noreply.github.com>
AuthorDate: Fri Jul 24 21:14:20 2026 +0000

    Publish built docs triggered by 561037c7bb218d1964f16c36be8f81cd95f6c50c
---
 _sources/contributors-guide/benchmarking.md.txt | 136 ++++++++++++++++--------
 contributors-guide/benchmarking.html            | 126 +++++++++++++++-------
 searchindex.js                                  |   2 +-
 3 files changed, 183 insertions(+), 81 deletions(-)

diff --git a/_sources/contributors-guide/benchmarking.md.txt b/_sources/contributors-guide/benchmarking.md.txt
index fb3b911bf..c707e6d3f 100644
--- a/_sources/contributors-guide/benchmarking.md.txt
+++ b/_sources/contributors-guide/benchmarking.md.txt
@@ -33,8 +33,13 @@ Current TPC-H **SF1000** results for Ballista, compared against a vanilla
 
 - **Cluster:** Kubernetes on AWS (`us-west-2`); one driver/scheduler pod and
   32 executor pods for each engine, launched on the same node pool.
-- **Executor pod (Ballista):** x86_64, 8 vCPU, 64 GiB memory.
-- **Executor pod (Spark):** x86_64, 8 vCPU, 64 GiB + 10 GiB overhead.
+- **K8s worker nodes:** `r6i.24xlarge` (96 vCPU, 768 GiB memory, 40 Gbps EBS
+  bandwidth, EBS-only — no local instance-store).
+- **Executor pod (Ballista):** x86_64, 8 vCPU, 64 GiB memory, plus a
+  dedicated 1000 GiB `gp3` EBS PVC mounted at `/data` for the executor's
+  shuffle work-dir (see [Executor storage](#executor-storage)).
+- **Executor pod (Spark):** x86_64, 8 vCPU, 64 GiB + 10 GiB overhead, plus a
+  dedicated `gp3` PVC via `spark-local-dir-1`.
 - **Client pod (Ballista):** the Python benchmark runner submits SQL to
   Ballista via `BallistaSessionContext` and collects results locally.
   Requires 64 GiB memory limit to complete the full 22-query suite —
@@ -43,24 +48,53 @@ Current TPC-H **SF1000** results for Ballista, compared against a vanilla
 - **Data:** TPC-H SF1000 Parquet on S3 (`us-west-2`), ZSTD compression,
   ~512 MiB row groups, one directory per table.
 
+## Executor storage
+
+Each Ballista executor pod is attached to a **fresh 1000 GiB `gp3` EBS
+volume** (generic-ephemeral PVC, `storageClassName: gp3`), mounted at
+`/data`, and the executor is launched with `--work-dir /data`. All shuffle
+temp files land on this dedicated volume.
+
+Without it, `--work-dir` defaults to a random directory under `/tmp` on the
+container overlay filesystem, i.e. onto the node's root EBS volume, which
+is shared with container images, `kubelet`, and every other pod on the
+same node. On `r6i.24xlarge` that shared bandwidth becomes the binding
+constraint under sustained shuffle-write pressure — `EXPLAIN ANALYZE`
+observed Q8's `SortShuffleWriter.write_time` inflate ~5× on the second
+run of a suite compared to a fresh cluster, despite the same 313 GB of
+shuffle output and zero spilling, because Q1–Q7's dirty pages force
+synchronous flushes to EBS at cap. Attaching a dedicated PVC removes that
+contention and brings in-suite per-query times in line with the standalone
+number.
+
+Spark on the same cluster has always used this pattern via
+`spark.kubernetes.executor.volumes.persistentVolumeClaim.spark-local-dir-1`.
+
 ## Ballista configuration
 
-| Flag / config key                                             | Value         |
-| ------------------------------------------------------------- | ------------- |
-| `--concurrent-tasks`                                          | `8`           |
-| `--memory-pool-size` (bytes; ≈70 % of the 64 GiB container)   | `48103633715` |
-| `datafusion.execution.target_partitions`                      | `256`         |
-| `datafusion.execution.collect_statistics`                     | `true`        |
-| `datafusion.execution.listing_table_factory_infer_partitions` | `false`       |
-| `datafusion.catalog.information_schema`                       | `true`        |
-| `ballista.planner.adaptive.enabled`                           | `true` (AQE)  |
-| `ballista.shuffle.sort_based.memory_limit_per_task_bytes`     | `0`           |
+| Flag / config key                                             | Value                                                                   |
+| ------------------------------------------------------------- | ----------------------------------------------------------------------- |
+| `--concurrent-tasks`                                          | `8`                                                                     |
+| `--memory-pool-size` (bytes; ≈70 % of the 64 GiB container)   | `48103633715`                                                           |
+| `--work-dir`                                                  | `/data` (dedicated gp3 PVC — see [Executor storage](#executor-storage)) |
+| `--grpc-server-max-decoding-message-size`                     | `134217728`                                                             |
+| `--grpc-server-max-encoding-message-size`                     | `134217728`                                                             |
+| `datafusion.execution.target_partitions`                      | `256`                                                                   |
+| `datafusion.execution.collect_statistics`                     | `true`                                                                  |
+| `datafusion.execution.listing_table_factory_infer_partitions` | `false`                                                                 |
+| `datafusion.catalog.information_schema`                       | `true`                                                                  |
+| `ballista.planner.adaptive.enabled`                           | `true` (AQE)                                                            |
+| `ballista.shuffle.sort_based.memory_limit_per_task_bytes`     | `0`                                                                     |
 
 `datafusion.optimizer.prefer_hash_join` is left at its default; under AQE the
 join strategy is selected at runtime by `DelayJoinSelectionRule` /
 `DynamicJoinSelectionExec` from runtime statistics and the broadcast /
 `ballista.optimizer.hash_join_max_build_partition_bytes` thresholds.
 
+The gRPC message-size ceiling is raised from the 16 MiB default to 128 MiB;
+some SF1000 physical plans (Q11, Q21, Q22) encode above 16 MiB and hit
+`OutOfRange` errors otherwise.
+
 ## Spark configuration (highlights)
 
 Vanilla Spark 3.4 — no Comet plugin, stock `SortShuffleManager`.
@@ -97,36 +131,46 @@ The SQLBench-H phrasing of the 22 TPC-H queries from
 ## Results
 
 **Times in seconds; lower is better.** Ballista: single iteration. Spark:
-mean of 3 iterations (cold iteration dropped by the harness).
-
-|              Query | Ballista (s) | Spark 3.4 (s) |
-| -----------------: | -----------: | ------------: |
-|                  1 |        21.16 |         67.58 |
-|                  2 |        32.37 |         29.80 |
-|                  3 |        32.69 |         25.13 |
-|                  4 |        27.75 |         21.19 |
-|                  5 |        49.37 |         54.12 |
-|                  6 |        16.17 |          1.23 |
-|                  7 |        48.24 |         19.57 |
-|                  8 |       189.30 |         48.60 |
-|                  9 |       154.88 |         69.38 |
-|                 10 |        67.72 |         35.92 |
-|                 11 |        26.72 |         30.88 |
-|                 12 |        24.46 |         10.78 |
-|                 13 |        18.36 |         20.45 |
-|                 14 |        19.93 |          7.00 |
-|                 15 |        27.56 |         23.75 |
-|                 16 |        18.03 |         23.41 |
-|                 17 |        60.46 |         82.30 |
-|                 18 |       282.79 |        129.40 |
-|                 19 |        23.28 |         11.26 |
-|                 20 |        88.93 |         19.22 |
-|                 21 |       110.87 |        101.53 |
-|                 22 |        12.17 |         12.71 |
-| **Total (Q1–Q22)** |  **1353.21** |    **845.21** |
-
-Row counts agree across engines for every query. Ballista completed the
-full 22-query suite in a single continuous run.
+mean of 3 iterations (cold iteration dropped by the harness). `FAIL` = query
+did not complete on this Ballista configuration.
+
+|                              Query | Ballista (s) | Spark 3.4 (s) |
+| ---------------------------------: | -----------: | ------------: |
+|                                  1 |        21.71 |         67.58 |
+|                                  2 |        26.73 |         29.80 |
+|                                  3 |        34.77 |         25.13 |
+|                                  4 |        20.73 |         21.19 |
+|                                  5 |        42.26 |         54.12 |
+|                                  6 |        13.78 |          1.23 |
+|                                  7 |        47.17 |         19.57 |
+|                                  8 |        45.74 |         48.60 |
+|                                  9 |        67.27 |         69.38 |
+|                                 10 |        52.99 |         35.92 |
+|                                 11 |     **FAIL** |         30.88 |
+|                                 12 |        25.97 |         10.78 |
+|                                 13 |        15.30 |         20.45 |
+|                                 14 |        21.13 |          7.00 |
+|                                 15 |        27.30 |         23.75 |
+|                                 16 |        17.38 |         23.41 |
+|                                 17 |        47.29 |         82.30 |
+|                                 18 |        78.32 |        129.40 |
+|                                 19 |        18.71 |         11.26 |
+|                                 20 |        97.13 |         19.22 |
+|                                 21 |     **FAIL** |        101.53 |
+|                                 22 |     **FAIL** |         12.71 |
+| **Total (comparable subset, 19Q)** |   **721.68** |    **700.09** |
+
+The total row sums Q1–Q10, Q12–Q20 — the queries that completed on both
+engines. Q11, Q21, Q22 currently fail on Ballista with an `OutOfRange`
+error (`decoded message length too large`); their physical plans encode
+above the client's default 16 MiB gRPC ceiling. Bumping the ceiling to
+128 MiB via `ballista.client.grpc_max_message_size` on the client side is
+still under investigation — the scheduler and executor sides accept the
+raised limit (see [Ballista configuration](#ballista-configuration)) but
+the client-submission channel is separate and continues to enforce 16 MiB
+in the current release.
+
+Row counts agree across engines for every query Ballista returned.
 
 ## Reproducing
 
@@ -140,9 +184,15 @@ ballista-executor \
   --bind-host 0.0.0.0 --bind-port 50051 \
   --scheduler-host <scheduler> --scheduler-port 50050 \
   --concurrent-tasks 8 \
-  --memory-pool-size 48103633715
+  --memory-pool-size 48103633715 \
+  --work-dir /data \
+  --grpc-server-max-decoding-message-size 134217728 \
+  --grpc-server-max-encoding-message-size 134217728
 ```
 
+`/data` should be a dedicated volume (e.g. a `gp3` PVC) sized for the
+suite's shuffle output — see [Executor storage](#executor-storage).
+
 Run all 22 queries:
 
 ```sh
diff --git a/contributors-guide/benchmarking.html b/contributors-guide/benchmarking.html
index d3f16c2b0..b9efec05c 100644
--- a/contributors-guide/benchmarking.html
+++ b/contributors-guide/benchmarking.html
@@ -416,8 +416,13 @@
 <ul class="simple">
 <li><p><strong>Cluster:</strong> Kubernetes on AWS (<code class="docutils literal notranslate"><span class="pre">us-west-2</span></code>); one driver/scheduler pod and
 32 executor pods for each engine, launched on the same node pool.</p></li>
-<li><p><strong>Executor pod (Ballista):</strong> x86_64, 8 vCPU, 64 GiB memory.</p></li>
-<li><p><strong>Executor pod (Spark):</strong> x86_64, 8 vCPU, 64 GiB + 10 GiB overhead.</p></li>
+<li><p><strong>K8s worker nodes:</strong> <code class="docutils literal notranslate"><span class="pre">r6i.24xlarge</span></code> (96 vCPU, 768 GiB memory, 40 Gbps EBS
+bandwidth, EBS-only — no local instance-store).</p></li>
+<li><p><strong>Executor pod (Ballista):</strong> x86_64, 8 vCPU, 64 GiB memory, plus a
+dedicated 1000 GiB <code class="docutils literal notranslate"><span class="pre">gp3</span></code> EBS PVC mounted at <code class="docutils literal notranslate"><span class="pre">/data</span></code> for the executor’s
+shuffle work-dir (see <a class="reference internal" href="#executor-storage"><span class="xref myst">Executor storage</span></a>).</p></li>
+<li><p><strong>Executor pod (Spark):</strong> x86_64, 8 vCPU, 64 GiB + 10 GiB overhead, plus a
+dedicated <code class="docutils literal notranslate"><span class="pre">gp3</span></code> PVC via <code class="docutils literal notranslate"><span class="pre">spark-local-dir-1</span></code>.</p></li>
 <li><p><strong>Client pod (Ballista):</strong> the Python benchmark runner submits SQL to
 Ballista via <code class="docutils literal notranslate"><span class="pre">BallistaSessionContext</span></code> and collects results locally.
 Requires 64 GiB memory limit to complete the full 22-query suite —
@@ -427,6 +432,26 @@ executor cluster is healthy.</p></li>
 ~512 MiB row groups, one directory per table.</p></li>
 </ul>
 </section>
+<section id="executor-storage">
+<h2>Executor storage<a class="headerlink" href="#executor-storage" title="Link to this heading">#</a></h2>
+<p>Each Ballista executor pod is attached to a <strong>fresh 1000 GiB <code class="docutils literal notranslate"><span class="pre">gp3</span></code> EBS
+volume</strong> (generic-ephemeral PVC, <code class="docutils literal notranslate"><span class="pre">storageClassName:</span> <span class="pre">gp3</span></code>), mounted at
+<code class="docutils literal notranslate"><span class="pre">/data</span></code>, and the executor is launched with <code class="docutils literal notranslate"><span class="pre">--work-dir</span> <span class="pre">/data</span></code>. All shuffle
+temp files land on this dedicated volume.</p>
+<p>Without it, <code class="docutils literal notranslate"><span class="pre">--work-dir</span></code> defaults to a random directory under <code class="docutils literal notranslate"><span class="pre">/tmp</span></code> on the
+container overlay filesystem, i.e. onto the node’s root EBS volume, which
+is shared with container images, <code class="docutils literal notranslate"><span class="pre">kubelet</span></code>, and every other pod on the
+same node. On <code class="docutils literal notranslate"><span class="pre">r6i.24xlarge</span></code> that shared bandwidth becomes the binding
+constraint under sustained shuffle-write pressure — <code class="docutils literal notranslate"><span class="pre">EXPLAIN</span> <span class="pre">ANALYZE</span></code>
+observed Q8’s <code class="docutils literal notranslate"><span class="pre">SortShuffleWriter.write_time</span></code> inflate ~5× on the second
+run of a suite compared to a fresh cluster, despite the same 313 GB of
+shuffle output and zero spilling, because Q1–Q7’s dirty pages force
+synchronous flushes to EBS at cap. Attaching a dedicated PVC removes that
+contention and brings in-suite per-query times in line with the standalone
+number.</p>
+<p>Spark on the same cluster has always used this pattern via
+<code class="docutils literal notranslate"><span class="pre">spark.kubernetes.executor.volumes.persistentVolumeClaim.spark-local-dir-1</span></code>.</p>
+</section>
 <section id="ballista-configuration">
 <h2>Ballista configuration<a class="headerlink" href="#ballista-configuration" title="Link to this heading">#</a></h2>
 <div class="pst-scrollable-table-container"><table class="table">
@@ -442,22 +467,31 @@ executor cluster is healthy.</p></li>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">--memory-pool-size</span></code> (bytes; ≈70 % of the 64 GiB container)</p></td>
 <td><p><code class="docutils literal notranslate"><span class="pre">48103633715</span></code></p></td>
 </tr>
-<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">datafusion.execution.target_partitions</span></code></p></td>
+<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">--work-dir</span></code></p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">/data</span></code> (dedicated gp3 PVC — see <a class="reference internal" href="#executor-storage"><span class="xref myst">Executor storage</span></a>)</p></td>
+</tr>
+<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">--grpc-server-max-decoding-message-size</span></code></p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">134217728</span></code></p></td>
+</tr>
+<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">--grpc-server-max-encoding-message-size</span></code></p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">134217728</span></code></p></td>
+</tr>
+<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">datafusion.execution.target_partitions</span></code></p></td>
 <td><p><code class="docutils literal notranslate"><span class="pre">256</span></code></p></td>
 </tr>
-<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">datafusion.execution.collect_statistics</span></code></p></td>
+<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">datafusion.execution.collect_statistics</span></code></p></td>
 <td><p><code class="docutils literal notranslate"><span class="pre">true</span></code></p></td>
 </tr>
-<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">datafusion.execution.listing_table_factory_infer_partitions</span></code></p></td>
+<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">datafusion.execution.listing_table_factory_infer_partitions</span></code></p></td>
 <td><p><code class="docutils literal notranslate"><span class="pre">false</span></code></p></td>
 </tr>
-<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">datafusion.catalog.information_schema</span></code></p></td>
+<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">datafusion.catalog.information_schema</span></code></p></td>
 <td><p><code class="docutils literal notranslate"><span class="pre">true</span></code></p></td>
 </tr>
-<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">ballista.planner.adaptive.enabled</span></code></p></td>
+<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">ballista.planner.adaptive.enabled</span></code></p></td>
 <td><p><code class="docutils literal notranslate"><span class="pre">true</span></code> (AQE)</p></td>
 </tr>
-<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">ballista.shuffle.sort_based.memory_limit_per_task_bytes</span></code></p></td>
+<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">ballista.shuffle.sort_based.memory_limit_per_task_bytes</span></code></p></td>
 <td><p><code class="docutils literal notranslate"><span class="pre">0</span></code></p></td>
 </tr>
 </tbody>
@@ -467,6 +501,9 @@ executor cluster is healthy.</p></li>
 join strategy is selected at runtime by <code class="docutils literal notranslate"><span class="pre">DelayJoinSelectionRule</span></code> /
 <code class="docutils literal notranslate"><span class="pre">DynamicJoinSelectionExec</span></code> from runtime statistics and the broadcast /
 <code class="docutils literal notranslate"><span class="pre">ballista.optimizer.hash_join_max_build_partition_bytes</span></code> thresholds.</p>
+<p>The gRPC message-size ceiling is raised from the 16 MiB default to 128 MiB;
+some SF1000 physical plans (Q11, Q21, Q22) encode above 16 MiB and hit
+<code class="docutils literal notranslate"><span class="pre">OutOfRange</span></code> errors otherwise.</p>
 </section>
 <section id="spark-configuration-highlights">
 <h2>Spark configuration (highlights)<a class="headerlink" href="#spark-configuration-highlights" title="Link to this heading">#</a></h2>
@@ -531,7 +568,8 @@ The matching Ballista executor runs <code class="docutils literal notranslate"><
 <section id="results">
 <h2>Results<a class="headerlink" href="#results" title="Link to this heading">#</a></h2>
 <p><strong>Times in seconds; lower is better.</strong> Ballista: single iteration. Spark:
-mean of 3 iterations (cold iteration dropped by the harness).</p>
+mean of 3 iterations (cold iteration dropped by the harness). <code class="docutils literal notranslate"><span class="pre">FAIL</span></code> = query
+did not complete on this Ballista configuration.</p>
 <div class="pst-scrollable-table-container"><table class="table">
 <thead>
 <tr class="row-odd"><th class="head text-right"><p>Query</p></th>
@@ -541,102 +579,110 @@ mean of 3 iterations (cold iteration dropped by the harness).</p>
 </thead>
 <tbody>
 <tr class="row-even"><td class="text-right"><p>1</p></td>
-<td class="text-right"><p>21.16</p></td>
+<td class="text-right"><p>21.71</p></td>
 <td class="text-right"><p>67.58</p></td>
 </tr>
 <tr class="row-odd"><td class="text-right"><p>2</p></td>
-<td class="text-right"><p>32.37</p></td>
+<td class="text-right"><p>26.73</p></td>
 <td class="text-right"><p>29.80</p></td>
 </tr>
 <tr class="row-even"><td class="text-right"><p>3</p></td>
-<td class="text-right"><p>32.69</p></td>
+<td class="text-right"><p>34.77</p></td>
 <td class="text-right"><p>25.13</p></td>
 </tr>
 <tr class="row-odd"><td class="text-right"><p>4</p></td>
-<td class="text-right"><p>27.75</p></td>
+<td class="text-right"><p>20.73</p></td>
 <td class="text-right"><p>21.19</p></td>
 </tr>
 <tr class="row-even"><td class="text-right"><p>5</p></td>
-<td class="text-right"><p>49.37</p></td>
+<td class="text-right"><p>42.26</p></td>
 <td class="text-right"><p>54.12</p></td>
 </tr>
 <tr class="row-odd"><td class="text-right"><p>6</p></td>
-<td class="text-right"><p>16.17</p></td>
+<td class="text-right"><p>13.78</p></td>
 <td class="text-right"><p>1.23</p></td>
 </tr>
 <tr class="row-even"><td class="text-right"><p>7</p></td>
-<td class="text-right"><p>48.24</p></td>
+<td class="text-right"><p>47.17</p></td>
 <td class="text-right"><p>19.57</p></td>
 </tr>
 <tr class="row-odd"><td class="text-right"><p>8</p></td>
-<td class="text-right"><p>189.30</p></td>
+<td class="text-right"><p>45.74</p></td>
 <td class="text-right"><p>48.60</p></td>
 </tr>
 <tr class="row-even"><td class="text-right"><p>9</p></td>
-<td class="text-right"><p>154.88</p></td>
+<td class="text-right"><p>67.27</p></td>
 <td class="text-right"><p>69.38</p></td>
 </tr>
 <tr class="row-odd"><td class="text-right"><p>10</p></td>
-<td class="text-right"><p>67.72</p></td>
+<td class="text-right"><p>52.99</p></td>
 <td class="text-right"><p>35.92</p></td>
 </tr>
 <tr class="row-even"><td class="text-right"><p>11</p></td>
-<td class="text-right"><p>26.72</p></td>
+<td class="text-right"><p><strong>FAIL</strong></p></td>
 <td class="text-right"><p>30.88</p></td>
 </tr>
 <tr class="row-odd"><td class="text-right"><p>12</p></td>
-<td class="text-right"><p>24.46</p></td>
+<td class="text-right"><p>25.97</p></td>
 <td class="text-right"><p>10.78</p></td>
 </tr>
 <tr class="row-even"><td class="text-right"><p>13</p></td>
-<td class="text-right"><p>18.36</p></td>
+<td class="text-right"><p>15.30</p></td>
 <td class="text-right"><p>20.45</p></td>
 </tr>
 <tr class="row-odd"><td class="text-right"><p>14</p></td>
-<td class="text-right"><p>19.93</p></td>
+<td class="text-right"><p>21.13</p></td>
 <td class="text-right"><p>7.00</p></td>
 </tr>
 <tr class="row-even"><td class="text-right"><p>15</p></td>
-<td class="text-right"><p>27.56</p></td>
+<td class="text-right"><p>27.30</p></td>
 <td class="text-right"><p>23.75</p></td>
 </tr>
 <tr class="row-odd"><td class="text-right"><p>16</p></td>
-<td class="text-right"><p>18.03</p></td>
+<td class="text-right"><p>17.38</p></td>
 <td class="text-right"><p>23.41</p></td>
 </tr>
 <tr class="row-even"><td class="text-right"><p>17</p></td>
-<td class="text-right"><p>60.46</p></td>
+<td class="text-right"><p>47.29</p></td>
 <td class="text-right"><p>82.30</p></td>
 </tr>
 <tr class="row-odd"><td class="text-right"><p>18</p></td>
-<td class="text-right"><p>282.79</p></td>
+<td class="text-right"><p>78.32</p></td>
 <td class="text-right"><p>129.40</p></td>
 </tr>
 <tr class="row-even"><td class="text-right"><p>19</p></td>
-<td class="text-right"><p>23.28</p></td>
+<td class="text-right"><p>18.71</p></td>
 <td class="text-right"><p>11.26</p></td>
 </tr>
 <tr class="row-odd"><td class="text-right"><p>20</p></td>
-<td class="text-right"><p>88.93</p></td>
+<td class="text-right"><p>97.13</p></td>
 <td class="text-right"><p>19.22</p></td>
 </tr>
 <tr class="row-even"><td class="text-right"><p>21</p></td>
-<td class="text-right"><p>110.87</p></td>
+<td class="text-right"><p><strong>FAIL</strong></p></td>
 <td class="text-right"><p>101.53</p></td>
 </tr>
 <tr class="row-odd"><td class="text-right"><p>22</p></td>
-<td class="text-right"><p>12.17</p></td>
+<td class="text-right"><p><strong>FAIL</strong></p></td>
 <td class="text-right"><p>12.71</p></td>
 </tr>
-<tr class="row-even"><td class="text-right"><p><strong>Total (Q1–Q22)</strong></p></td>
-<td class="text-right"><p><strong>1353.21</strong></p></td>
-<td class="text-right"><p><strong>845.21</strong></p></td>
+<tr class="row-even"><td class="text-right"><p><strong>Total (comparable subset, 19Q)</strong></p></td>
+<td class="text-right"><p><strong>721.68</strong></p></td>
+<td class="text-right"><p><strong>700.09</strong></p></td>
 </tr>
 </tbody>
 </table>
 </div>
-<p>Row counts agree across engines for every query. Ballista completed the
-full 22-query suite in a single continuous run.</p>
+<p>The total row sums Q1–Q10, Q12–Q20 — the queries that completed on both
+engines. Q11, Q21, Q22 currently fail on Ballista with an <code class="docutils literal notranslate"><span class="pre">OutOfRange</span></code>
+error (<code class="docutils literal notranslate"><span class="pre">decoded</span> <span class="pre">message</span> <span class="pre">length</span> <span class="pre">too</span> <span class="pre">large</span></code>); their physical plans encode
+above the client’s default 16 MiB gRPC ceiling. Bumping the ceiling to
+128 MiB via <code class="docutils literal notranslate"><span class="pre">ballista.client.grpc_max_message_size</span></code> on the client side is
+still under investigation — the scheduler and executor sides accept the
+raised limit (see <a class="reference internal" href="#ballista-configuration"><span class="xref myst">Ballista configuration</span></a>) but
+the client-submission channel is separate and continues to enforce 16 MiB
+in the current release.</p>
+<p>Row counts agree across engines for every query Ballista returned.</p>
 </section>
 <section id="reproducing">
 <h2>Reproducing<a class="headerlink" href="#reproducing" title="Link to this heading">#</a></h2>
@@ -648,9 +694,14 @@ client. Executor sizing on each node:</p>
 <span class="w">  </span>--bind-host<span class="w"> </span><span class="m">0</span>.0.0.0<span class="w"> </span>--bind-port<span class="w"> </span><span class="m">50051</span><span class="w"> </span><span class="se">\</span>
 <span class="w">  </span>--scheduler-host<span class="w"> </span>&lt;scheduler&gt;<span class="w"> </span>--scheduler-port<span class="w"> </span><span class="m">50050</span><span class="w"> </span><span class="se">\</span>
 <span class="w">  </span>--concurrent-tasks<span class="w"> </span><span class="m">8</span><span class="w"> </span><span class="se">\</span>
-<span class="w">  </span>--memory-pool-size<span class="w"> </span><span class="m">48103633715</span>
+<span class="w">  </span>--memory-pool-size<span class="w"> </span><span class="m">48103633715</span><span class="w"> </span><span class="se">\</span>
+<span class="w">  </span>--work-dir<span class="w"> </span>/data<span class="w"> </span><span class="se">\</span>
+<span class="w">  </span>--grpc-server-max-decoding-message-size<span class="w"> </span><span class="m">134217728</span><span class="w"> </span><span class="se">\</span>
+<span class="w">  </span>--grpc-server-max-encoding-message-size<span class="w"> </span><span class="m">134217728</span>
 </pre></div>
 </div>
+<p><code class="docutils literal notranslate"><span class="pre">/data</span></code> should be a dedicated volume (e.g. a <code class="docutils literal notranslate"><span class="pre">gp3</span></code> PVC) sized for the
+suite’s shuffle output — see <a class="reference internal" href="#executor-storage"><span class="xref myst">Executor storage</span></a>.</p>
 <p>Run all 22 queries:</p>
 <div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>tpch<span class="w"> </span>benchmark<span class="w"> </span>ballista<span class="w"> </span><span class="se">\</span>
 <span class="w">  </span>--host<span class="w"> </span>&lt;scheduler&gt;<span class="w"> </span>--port<span class="w"> </span><span class="m">50050</span><span class="w"> </span><span class="se">\</span>
@@ -749,6 +800,7 @@ open issues found by benchmarking: <a class="reference external" href="https://g
     <ul class="pst-show_toc_level nav section-nav flex-column">
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#versions-under-test">Versions under test</a></li>
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#environment">Environment</a></li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#executor-storage">Executor storage</a></li>
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#ballista-configuration">Ballista configuration</a></li>
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#spark-configuration-highlights">Spark configuration (highlights)</a></li>
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#queries">Queries</a></li>
diff --git a/searchindex.js b/searchindex.js
index c0fc675de..317a855ff 100644
--- a/searchindex.js
+++ b/searchindex.js
@@ -1 +1 @@
-Search.setIndex({"alltitles":{"AQE join behavior (opt-in)":[[27,"aqe-join-behavior-opt-in"]],"Adaptive Query Execution (AQE)":[[21,"adaptive-query-execution-aqe"]],"Adaptive Query Execution (Experimental)":[[50,"adaptive-query-execution-experimental"]],"Adding a persona":[[25,"adding-a-persona"]],"Aggregate Functions":[[49,"aggregate-functions"]],"Apache DataFusion Ballista":[[26,null]],"Apache DataFusion Ballista 0.10.0 Changelog":[[0,null]],"Apache DataFusion Ballista 0.11.0 Changelog" [...]
\ No newline at end of file
+Search.setIndex({"alltitles":{"AQE join behavior (opt-in)":[[27,"aqe-join-behavior-opt-in"]],"Adaptive Query Execution (AQE)":[[21,"adaptive-query-execution-aqe"]],"Adaptive Query Execution (Experimental)":[[50,"adaptive-query-execution-experimental"]],"Adding a persona":[[25,"adding-a-persona"]],"Aggregate Functions":[[49,"aggregate-functions"]],"Apache DataFusion Ballista":[[26,null]],"Apache DataFusion Ballista 0.10.0 Changelog":[[0,null]],"Apache DataFusion Ballista 0.11.0 Changelog" [...]
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@datafusion.apache.org
For additional commands, e-mail: commits-help@datafusion.apache.org