This is an automated email from the ASF dual-hosted git repository.
andygrove pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/datafusion-ballista.git
The following commit(s) were added to refs/heads/main by this push:
new acede2739 docs: add user personas as a review contract for additive
changes (#2002)
acede2739 is described below
commit acede27396fa73fc690c5aa77fb40f82ce838871
Author: Andy Grove <[email protected]>
AuthorDate: Sun Jul 12 10:51:13 2026 -0600
docs: add user personas as a review contract for additive changes (#2002)
* docs: add user personas as a review contract for additive changes
Ballista serves several distinct audiences, each depending on a different
set of guarantees: DataFusion users going multi-node who want transparent
distribution with identical results, Spark users who want the stage/task
execution model and AQE exposed and tunable, and library users embedding
Ballista as the foundation for a specialized engine who depend on stable,
composable APIs and extension points.
Add a User Personas page to the Contributors Guide that names these
audiences and, for each, records the capabilities it relies on and the
red flags that would regress it. The registry is a review contract:
changes must be additive, so reviewers can check pull requests against it
to avoid silently taking functionality away from an existing audience.
* docs: add "Who is Ballista for" section to the README
Summarize the three audiences Ballista serves — DataFusion users going
multi-node, Spark users wanting the same execution model, and library
users building a specialized engine — and link to the full User Personas
guide for the guarantees each relies on.
---
README.md | 10 ++
docs/source/contributors-guide/user-personas.md | 148 ++++++++++++++++++++++++
docs/source/index.rst | 1 +
3 files changed, 159 insertions(+)
diff --git a/README.md b/README.md
index fe0c20485..99f3a3033 100644
--- a/README.md
+++ b/README.md
@@ -89,6 +89,16 @@ async fn main() -> datafusion::error::Result<()> {
For documentation or more examples, please refer to the [Ballista User
Guide][user-guide].
+## Who is Ballista for
+
+Ballista serves several distinct audiences:
+
+- **DataFusion users going multi-node** — you already use [Apache
DataFusion](https://github.com/apache/datafusion) on a single machine and have
outgrown it. Ballista runs the same SQL and DataFrame workloads across a
cluster with minimal code changes and the same results.
+- **Spark users wanting the same execution model** — you run Spark SQL or
batch jobs and want a lighter, Rust-native alternative without relearning a new
paradigm. Ballista keeps the familiar model: plans split into stages at shuffle
boundaries, one task per partition, executors with task slots, and adaptive
query execution (AQE).
+- **Library users building a specialized engine** — you are building a bespoke
distributed query engine and want reusable scheduler, executor, and
plan-serialization building blocks with extension points, instead of writing
distributed execution from scratch.
+
+These audiences are documented in more detail, along with the guarantees each
relies on, in the [User
Personas](docs/source/contributors-guide/user-personas.md) guide.
+
## Architecture
A Ballista cluster consists of one or more scheduler processes and one or more
executor processes. These processes
diff --git a/docs/source/contributors-guide/user-personas.md
b/docs/source/contributors-guide/user-personas.md
new file mode 100644
index 000000000..a54d03854
--- /dev/null
+++ b/docs/source/contributors-guide/user-personas.md
@@ -0,0 +1,148 @@
+<!---
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+
+# User Personas
+
+Ballista serves several distinct audiences, each of which comes to the project
+for a different reason and depends on a different set of capabilities. This
page
+names those audiences as **personas** and, for each one, records the guarantees
+that audience relies on.
+
+## Why this page exists
+
+This is a review contract, not marketing copy. It exists so that changes to
+Ballista stay **additive**:
+
+- A pull request may **add** a new persona, or **extend** an existing one with
+ new capabilities.
+- A pull request must **not remove or silently regress** a capability that an
+ existing persona depends on.
+
+Reviewers evaluate every non-trivial pull request against this list. Each
+persona lists concrete "red flags" — the kinds of change that would quietly
take
+functionality away from that audience. A red flag does not mean a change is
+forbidden, but it does mean the change needs explicit discussion and maintainer
+sign-off, and usually a migration path (for example an entry in the
+[upgrade guide](../upgrading/index)), rather than landing silently.
+
+These personas are deliberately in tension with one another. One audience wants
+distributed execution to be a transparent implementation detail; another wants
+the execution model exposed and tunable; another wants Ballista's internals to
+be a stable, composable library. The point of keeping them all written down is
+to make sure a change that delights one audience does not quietly break
another.
+
+## Persona 1: The DataFusion user going multi-node
+
+- **Who**: A data engineer or analyst already using
+ [DataFusion](https://datafusion.apache.org/) single-process (often through
the
+ Python bindings) who has outgrown a single machine.
+- **Coming from**: DataFusion, single process.
+- **Why Ballista**: Run the same SQL and DataFrame workloads across a cluster
+ with minimal code change and _identical results_.
+- **Depends on** (must not regress):
+ - Query results and semantics match single-process DataFusion for the same
+ input.
+ - A client surface that mirrors DataFusion's `SessionContext` / DataFrame /
SQL
+ API.
+ - `datafusion.*` session configuration overrides are honored end-to-end, so
+ users tune DataFusion the way they already do.
+ - Standard object stores and file formats work and produce correct results
+ across partitions.
+ - Distributed execution is _transparent_: getting a correct answer never
+ requires the user to reason about stages, tasks, or partitioning.
+- **Red flags in a pull request**:
+ - Results diverge from single-process DataFusion for the same input.
+ - `datafusion.*` overrides are dropped or ignored during scheduling/planning.
+ - A DataFusion feature that is correct single-node becomes silently wrong
when
+ the plan is split across stages (for example dynamic filter pushdown,
+ uncorrelated scalar subqueries, or a scan reading more than its assigned
+ partition).
+ - Client API changes that break the DataFusion-mirroring surface.
+
+## Persona 2: The Spark user wanting the same execution model
+
+- **Who**: A data engineer or platform owner running Spark SQL / batch jobs who
+ wants a lighter, Rust-native alternative without relearning a new execution
+ paradigm.
+- **Coming from**: Apache Spark.
+- **Why Ballista**: Keep the Spark mental model — plans split into **stages**
at
+ shuffle boundaries, one **task** per partition, shuffle files, executors with
+ task slots, and adaptive query execution (**AQE**) for runtime adaptivity —
on
+ top of DataFusion and Arrow.
+- **Depends on** (must not regress):
+ - The stage/task execution model at shuffle boundaries.
+ - The AQE / adaptive planner path (partition coalescing, dynamic join
+ selection, runtime broadcast), available and gated behind configuration.
+ - Broadcast joins for small build sides, to avoid shuffles and skew (the
+ equivalent of Spark's broadcast hash join).
+ - The operational surface Spark users expect: a scheduler plus executors,
+ task-slot concurrency, a tunable `target_partitions`, and stage/task
+ observability (task timings, a history server / UI) for debugging skew.
+ - Behavior driven by configuration and `SET`, not hard-coded planner choices.
+- **Red flags in a pull request**:
+ - Removing or short-circuiting the stage/task boundary model, or collapsing
+ toward single-process execution.
+ - Regressing or removing the AQE / adaptive planner path — or making it the
+ only path in a way that breaks Persona 1's transparent static path.
+ - Hard-coding a join or planner strategy instead of gating it behind
+ configuration.
+ - Removing the stage/task observability that Spark users rely on to diagnose
+ skew.
+
+## Persona 3: The library user building a specialized engine
+
+- **Who**: An engineer using Ballista as a _framework_ — the foundation for a
+ specialized or bespoke distributed query engine — rather than as a turnkey
+ cluster.
+- **Coming from**: Building on DataFusion as a library, now needing
distribution
+ (or replacing a hand-rolled distributed layer).
+- **Why Ballista**: Reusable scheduler, executor, and plan-serialization
+ building blocks with extension points, instead of writing distributed
+ execution from scratch.
+- **Depends on** (must not regress):
+ - Stable, composable public APIs across the `scheduler`, `executor`,
`client`,
+ and `core` crates (the execution graph and plan serialization included).
+ - Extension points that do not require forking: custom object stores,
+ physical/logical extension codecs, custom operators and functions, a
+ pluggable runtime producer, custom session configuration, and a custom
query
+ planner.
+ - Behavior that stays _configurable rather than hard-coded_, so an embedder
can
+ swap the planner, join strategy, partitioning, or runtime environment.
+ - Backward-compatible public APIs, with breaking changes signaled in the
+ [upgrade guide](../upgrading/index).
+ - No assumptions baked into the core that only fit the built-in clients or
the
+ TPC-H benchmark.
+- **Red flags in a pull request**:
+ - Breaking a public API signature without an upgrade-guide entry.
+ - Hard-coding behavior that used to be pluggable, or removing an extension
+ point (an extension-codec argument, the runtime-producer override,
+ session-config injection).
+ - Coupling core logic to a specific client, planner, or benchmark instead of
+ keeping it behind a trait or configuration.
+ - Wire-format or serialization changes that break externally-produced plans
+ with no compatibility path.
+
+## Adding a persona
+
+This registry is append-only. As Ballista attracts new kinds of users, add a
+persona for each one via a pull request, using the same schema (who they are,
+what they are coming from, why Ballista, what they depend on, and the red flags
+that would regress them). Do not remove existing personas: an audience that
+relied on Ballista does not stop existing because our priorities shifted, and
+the whole value of this page is that the guarantees only accumulate.
diff --git a/docs/source/index.rst b/docs/source/index.rst
index e66e23752..c208c29ec 100644
--- a/docs/source/index.rst
+++ b/docs/source/index.rst
@@ -78,6 +78,7 @@ Table of content
contributors-guide/architecture
contributors-guide/code-organization
+ contributors-guide/user-personas
contributors-guide/development
Source code <https://github.com/apache/datafusion-ballista/>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]