This is an automated email from the ASF dual-hosted git repository.
github-bot pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/datafusion-comet.git
The following commit(s) were added to refs/heads/asf-site by this push:
new a9ae33d14 Publish built docs triggered by
ba6b3ce214f5d6bfdca8d627318df20025e35414
a9ae33d14 is described below
commit a9ae33d147a59dd7ed2bb671d9bc1bf5fb7050c6
Author: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
AuthorDate: Wed Apr 1 10:29:20 2026 +0000
Publish built docs triggered by ba6b3ce214f5d6bfdca8d627318df20025e35414
---
_sources/contributor-guide/index.md.txt | 2 +-
_sources/contributor-guide/profiling.md.txt | 296 +++++++++++++++++++++
.../contributor-guide/profiling_native_code.md.txt | 94 -------
contributor-guide/adding_a_new_expression.html | 2 +-
contributor-guide/adding_a_new_operator.html | 2 +-
contributor-guide/benchmarking.html | 2 +-
contributor-guide/bug_triage.html | 2 +-
contributor-guide/contributing.html | 2 +-
contributor-guide/debugging.html | 2 +-
contributor-guide/development.html | 2 +-
contributor-guide/ffi.html | 2 +-
contributor-guide/iceberg-spark-tests.html | 2 +-
contributor-guide/index.html | 11 +-
contributor-guide/jvm_shuffle.html | 2 +-
contributor-guide/native_shuffle.html | 2 +-
contributor-guide/parquet_scans.html | 2 +-
contributor-guide/plugin_overview.html | 2 +-
.../{profiling_native_code.html => profiling.html} | 291 +++++++++++++++++++-
contributor-guide/release_process.html | 2 +-
contributor-guide/roadmap.html | 2 +-
contributor-guide/spark-sql-tests.html | 8 +-
contributor-guide/sql-file-tests.html | 2 +-
contributor-guide/tracing.html | 8 +-
objects.inv | Bin 1654 -> 1643 bytes
searchindex.js | 2 +-
25 files changed, 609 insertions(+), 135 deletions(-)
diff --git a/_sources/contributor-guide/index.md.txt
b/_sources/contributor-guide/index.md.txt
index f6c1f4a10..0e46f5c82 100644
--- a/_sources/contributor-guide/index.md.txt
+++ b/_sources/contributor-guide/index.md.txt
@@ -35,7 +35,7 @@ Benchmarking Guide <benchmarking>
Adding a New Operator <adding_a_new_operator>
Adding a New Expression <adding_a_new_expression>
Tracing <tracing>
-Profiling Native Code <profiling_native_code>
+Profiling <profiling>
Spark SQL Tests <spark-sql-tests.md>
Iceberg Spark Tests <iceberg-spark-tests.md>
SQL File Tests <sql-file-tests.md>
diff --git a/_sources/contributor-guide/profiling.md.txt
b/_sources/contributor-guide/profiling.md.txt
new file mode 100644
index 000000000..67729a235
--- /dev/null
+++ b/_sources/contributor-guide/profiling.md.txt
@@ -0,0 +1,296 @@
+<!--
+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.
+-->
+
+# Profiling
+
+This guide covers profiling tools and techniques for Comet development.
Because Comet
+spans JVM (Spark) and native (Rust) code, choosing the right profiler depends
on what
+you are investigating.
+
+## Choosing a Profiling Tool
+
+| Tool
| JVM Frames | Native (Rust) Frames | Install Required | Best For
|
+|
------------------------------------------------------------------------------
| ---------- | -------------------- | ---------------- |
------------------------------------------------------------------------------ |
+| [async-profiler](https://github.com/async-profiler/async-profiler)
| Yes | Yes | Yes | End-to-end Comet
profiling with unified JVM + native flame graphs |
+| [Java Flight Recorder
(JFR)](https://docs.oracle.com/en/java/javase/17/jfapi/) | Yes | No
| No (JDK 11+) | GC pressure, allocations, thread contention,
I/O — any JVM-level investigation |
+| [cargo-flamegraph](https://github.com/flamegraph-rs/flamegraph)
| No | Yes | Yes | Isolated Rust
micro-benchmarks without a JVM |
+
+**Recommendation:** Use **async-profiler** when profiling Spark queries with
Comet enabled —
+it is the only tool that shows both JVM and native frames in a single flame
graph.
+Use **JFR** when you need rich JVM event data (GC, locks, I/O) without
installing anything.
+Use **cargo-flamegraph** when working on native code in isolation via `cargo
bench`.
+
+## Profiling with async-profiler
+
+[async-profiler](https://github.com/async-profiler/async-profiler) captures
JVM and
+native code in the same flame graph by using Linux `perf_events` or macOS
`dtrace`.
+This makes it ideal for profiling Comet, where hot paths cross the JNI
boundary between
+Spark and Rust.
+
+### Installation
+
+Download a release from the [async-profiler releases
page](https://github.com/async-profiler/async-profiler/releases):
+
+```shell
+# Linux x64
+wget
https://github.com/async-profiler/async-profiler/releases/download/v3.0/async-profiler-3.0-linux-x64.tar.gz
+mkdir -p $HOME/opt/async-profiler
+tar xzf async-profiler-3.0-linux-x64.tar.gz -C $HOME/opt/async-profiler
--strip-components=1
+export ASYNC_PROFILER_HOME=$HOME/opt/async-profiler
+```
+
+On macOS, download the appropriate `macos` archive instead.
+
+### Attaching to a running Spark application
+
+Use the `asprof` launcher to attach to a running JVM by PID:
+
+```shell
+# Start CPU profiling for 30 seconds, output an HTML flame graph
+$ASYNC_PROFILER_HOME/bin/asprof -d 30 -f flamegraph.html <pid>
+
+# Wall-clock profiling
+$ASYNC_PROFILER_HOME/bin/asprof -e wall -d 30 -f flamegraph.html <pid>
+
+# Start profiling (no duration limit), then stop later
+$ASYNC_PROFILER_HOME/bin/asprof start -e cpu <pid>
+# ... run your query ...
+$ASYNC_PROFILER_HOME/bin/asprof stop -f flamegraph.html <pid>
+```
+
+Find the Spark driver/executor PID with `jps` or `pgrep -f SparkSubmit`.
+
+### Passing profiler flags via spark-submit
+
+You can also attach async-profiler as a Java agent at JVM startup:
+
+```shell
+spark-submit \
+ --conf
"spark.driver.extraJavaOptions=-agentpath:$ASYNC_PROFILER_HOME/lib/libasyncProfiler.so=start,event=cpu,file=driver.html,tree"
\
+ --conf
"spark.executor.extraJavaOptions=-agentpath:$ASYNC_PROFILER_HOME/lib/libasyncProfiler.so=start,event=cpu,file=executor.html,tree"
\
+ ...
+```
+
+Note: If the executor is distributed then `executor.html` will be written on
the remote node.
+
+### Choosing an event type
+
+| Event | When to use
|
+| ------- |
---------------------------------------------------------------------------------------------------------
|
+| `cpu` | Default. Shows where CPU cycles are spent. Use for compute-bound
queries. |
+| `wall` | Wall-clock time including blocked/waiting threads. Use to find JNI
boundary overhead and I/O stalls. |
+| `alloc` | Heap allocation profiling. Use to find JVM allocation hotspots
around Arrow FFI and columnar conversions. |
+| `lock` | Lock contention. Use when threads appear to spend time waiting on
synchronized blocks or locks. |
+
+### Output formats
+
+| Format | Flag | Description
|
+| ---------------- | ------------------ |
-------------------------------------------------- |
+| HTML flame graph | `-f out.html` | Interactive flame graph (default and
most useful). |
+| JFR | `-f out.jfr` | Viewable in JDK Mission Control or
IntelliJ. |
+| Collapsed stacks | `-f out.collapsed` | For use with Brendan Gregg's
FlameGraph scripts. |
+| Text summary | `-o text` | Flat list of hot methods.
|
+
+### Platform notes
+
+**Linux:** Set `perf_event_paranoid` to allow profiling:
+
+```shell
+sudo sysctl kernel.perf_event_paranoid=1 # or 0 / -1 for full access
+sudo sysctl kernel.kptr_restrict=0 # optional: enable kernel symbols
+```
+
+**macOS:** async-profiler uses `dtrace` on macOS, which requires running as
root or
+with SIP (System Integrity Protection) adjustments. Native Rust frames may not
be fully
+resolved on macOS; Linux is recommended for the most complete flame graphs.
+
+### Integrated benchmark profiling
+
+The TPC benchmark scripts in `benchmarks/tpc/` have built-in async-profiler
support via
+the `--async-profiler` flag. See
[benchmarks/tpc/README.md](https://github.com/apache/datafusion-comet/blob/main/benchmarks/tpc/README.md)
+for details.
+
+## Profiling with Java Flight Recorder
+
+[Java Flight Recorder (JFR)](https://docs.oracle.com/en/java/javase/17/jfapi/)
is built
+into JDK 11+ and collects detailed JVM runtime data with very low overhead. It
does not
+see native Rust frames, but is excellent for diagnosing GC pressure, thread
contention,
+I/O latency, and JVM-level allocation patterns.
+
+### Adding JFR flags to spark-submit
+
+```shell
+spark-submit \
+ --conf
"spark.driver.extraJavaOptions=-XX:StartFlightRecording=duration=120s,filename=driver.jfr"
\
+ --conf
"spark.executor.extraJavaOptions=-XX:StartFlightRecording=duration=120s,filename=executor.jfr"
\
+ ...
+```
+
+For continuous recording without a fixed duration:
+
+```shell
+--conf
"spark.driver.extraJavaOptions=-XX:StartFlightRecording=disk=true,maxsize=500m,filename=driver.jfr"
+```
+
+You can also start and stop recording dynamically using `jcmd`:
+
+```shell
+jcmd <pid> JFR.start name=profile
+# ... run your query ...
+jcmd <pid> JFR.stop name=profile filename=recording.jfr
+```
+
+### Viewing recordings
+
+- **[JDK Mission Control (JMC)](https://jdk.java.net/jmc/)** — the most
comprehensive viewer.
+ Shows flame graphs, GC timeline, thread activity, I/O, and allocation hot
spots.
+- **IntelliJ IDEA** — open `.jfr` files directly in the built-in profiler
+ (Run → Open Profiler Snapshot).
+- **`jfr` CLI** — quick summaries from the command line: `jfr summary
driver.jfr`
+
+### Useful JFR events for Comet debugging
+
+| Event | What
it shows |
+| ------------------------------------------------------------------- |
--------------------------------------------------------------------------- |
+| `jdk.GCPhasePause` | GC
pause durations — helps identify memory pressure from Arrow allocations. |
+| `jdk.ObjectAllocationInNewTLAB` / `jdk.ObjectAllocationOutsideTLAB` |
Allocation hot spots. |
+| `jdk.JavaMonitorWait` / `jdk.ThreadPark` | Thread
contention and lock waits. |
+| `jdk.FileRead` / `jdk.FileWrite` / `jdk.SocketRead` | I/O
latency. |
+| `jdk.ExecutionSample` | CPU
sampling (method profiling, similar to a flame graph). |
+
+### Integrated benchmark profiling
+
+The TPC benchmark scripts support `--jfr` for automatic JFR recording during
benchmark
+runs. See
[benchmarks/tpc/README.md](https://github.com/apache/datafusion-comet/blob/main/benchmarks/tpc/README.md)
for details.
+
+## Profiling Native Code with cargo-flamegraph
+
+For profiling Rust code in isolation — without a JVM — use `cargo bench` with
+[cargo-flamegraph](https://github.com/flamegraph-rs/flamegraph).
+
+### Running micro benchmarks with cargo bench
+
+When implementing a new operator or expression, it is good practice to add a
new microbenchmark under `core/benches`.
+
+It is often easiest to copy an existing benchmark and modify it for the new
operator or expression. It is also
+necessary to add a new section to the `Cargo.toml` file, such as:
+
+```toml
+[[bench]]
+name = "shuffle_writer"
+harness = false
+```
+
+These benchmarks are useful for comparing performance between releases or
between feature branches and the
+main branch to help prevent regressions in performance when adding new
features or fixing bugs.
+
+Individual benchmarks can be run by name with the following command.
+
+```shell
+cargo bench shuffle_writer
+```
+
+Here is some sample output from running this command.
+
+```
+ Running benches/shuffle_writer.rs
(target/release/deps/shuffle_writer-e37b59e37879cce7)
+Gnuplot not found, using plotters backend
+shuffle_writer/shuffle_writer
+ time: [2.0880 ms 2.0989 ms 2.1118 ms]
+Found 9 outliers among 100 measurements (9.00%)
+ 3 (3.00%) high mild
+ 6 (6.00%) high severe
+```
+
+### Profiling with cargo-flamegraph
+
+Install cargo-flamegraph:
+
+```shell
+cargo install flamegraph
+```
+
+Follow the instructions in
[cargo-flamegraph](https://github.com/flamegraph-rs/flamegraph) for your
platform for
+running flamegraph.
+
+Here is a sample command for running `cargo-flamegraph` on MacOS.
+
+```shell
+cargo flamegraph --root --bench shuffle_writer
+```
+
+This will produce output similar to the following.
+
+```
+dtrace: system integrity protection is on, some features will not be available
+
+dtrace: description 'profile-997 ' matched 1 probe
+Gnuplot not found, using plotters backend
+Testing shuffle_writer/shuffle_writer
+Success
+
+dtrace: pid 66402 has exited
+writing flamegraph to "flamegraph.svg"
+```
+
+The generated flamegraph can now be opened in a browser that supports svg
format.
+
+Here is the flamegraph for this example:
+
+
+
+## Tips for Profiling Comet
+
+### Use wall-clock profiling to spot JNI boundary overhead
+
+When profiling Comet with async-profiler, `wall` mode is often more revealing
than `cpu`
+because it captures time spent crossing the JNI boundary, waiting for native
results,
+and blocked on I/O — none of which show up in CPU-only profiles.
+
+```shell
+$ASYNC_PROFILER_HOME/bin/asprof -e wall -d 60 -f wall-profile.html <pid>
+```
+
+### Use alloc profiling around Arrow FFI
+
+JVM allocation profiling can identify hotspots in the Arrow FFI path where
temporary
+objects are created during data transfer between JVM and native code:
+
+```shell
+$ASYNC_PROFILER_HOME/bin/asprof -e alloc -d 60 -f alloc-profile.html <pid>
+```
+
+Look for allocations in `CometExecIterator`, `CometBatchIterator`, and Arrow
vector
+classes.
+
+### Isolate Rust-only performance issues
+
+If a flame graph shows the hot path is entirely within native code, switch to
+`cargo-flamegraph` to get better symbol resolution and avoid JVM noise:
+
+```shell
+cd native
+cargo flamegraph --root --bench <benchmark_name>
+```
+
+### Correlating JVM and native frames
+
+In async-profiler flame graphs, native Rust frames appear below JNI entry
points like
+`Java_org_apache_comet_Native_*`. Look for these transition points to
understand how
+time is split between Spark's JVM code and Comet's native execution.
diff --git a/_sources/contributor-guide/profiling_native_code.md.txt
b/_sources/contributor-guide/profiling_native_code.md.txt
deleted file mode 100644
index ec3349b2e..000000000
--- a/_sources/contributor-guide/profiling_native_code.md.txt
+++ /dev/null
@@ -1,94 +0,0 @@
-<!--
-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.
--->
-
-# Profiling Native Code
-
-We use `cargo bench` to run benchmarks to measure the performance of
individual operators and expressions
-and [cargo-flamegraph](https://github.com/flamegraph-rs/flamegraph) for
profiling.
-
-## Running micro benchmarks with cargo bench
-
-When implementing a new operator or expression, it is good practice to add a
new microbenchmark under `core/benches`.
-
-It is often easiest to copy an existing benchmark and modify it for the new
operator or expression. It is also
-necessary to add a new section to the `Cargo.toml` file, such as:
-
-```toml
-[[bench]]
-name = "shuffle_writer"
-harness = false
-```
-
-These benchmarks are useful when for comparing performance between releases or
between feature branches and the
-main branch to help prevent regressions in performance when adding new
features or fixing bugs.
-
-Individual benchmarks can be run by name with the following command.
-
-```shell
-cargo bench shuffle_writer
-```
-
-Here is some sample output from running this command.
-
-```
- Running benches/shuffle_writer.rs
(target/release/deps/shuffle_writer-e37b59e37879cce7)
-Gnuplot not found, using plotters backend
-shuffle_writer/shuffle_writer
- time: [2.0880 ms 2.0989 ms 2.1118 ms]
-Found 9 outliers among 100 measurements (9.00%)
- 3 (3.00%) high mild
- 6 (6.00%) high severe
-```
-
-## Profiling with cargo-flamegraph
-
-Install cargo-flamegraph:
-
-```shell
-cargo install flamegraph
-```
-
-Follow the instructions in
[cargo-flamegraph](https://github.com/flamegraph-rs/flamegraph) for your
platform for
-running flamegraph.
-
-Here is a sample command for running `cargo-flamegraph` on MacOS.
-
-```shell
-cargo flamegraph --root --bench shuffle_writer
-```
-
-This will produce output similar to the following.
-
-```
-dtrace: system integrity protection is on, some features will not be available
-
-dtrace: description 'profile-997 ' matched 1 probe
-Gnuplot not found, using plotters backend
-Testing shuffle_writer/shuffle_writer
-Success
-
-dtrace: pid 66402 has exited
-writing flamegraph to "flamegraph.svg"
-```
-
-The generated flamegraph can now be opened in a browser that supports svg
format.
-
-Here is the flamegraph for this example:
-
-
diff --git a/contributor-guide/adding_a_new_expression.html
b/contributor-guide/adding_a_new_expression.html
index fbda6d78d..5f5d2ebe6 100644
--- a/contributor-guide/adding_a_new_expression.html
+++ b/contributor-guide/adding_a_new_expression.html
@@ -366,7 +366,7 @@ under the License.
<li class="toctree-l2"><a class="reference internal"
href="adding_a_new_operator.html">Adding a New Operator</a></li>
<li class="toctree-l2 current"><a class="current reference internal"
href="#">Adding a New Expression</a></li>
<li class="toctree-l2"><a class="reference internal"
href="tracing.html">Tracing</a></li>
-<li class="toctree-l2"><a class="reference internal"
href="profiling_native_code.html">Profiling Native Code</a></li>
+<li class="toctree-l2"><a class="reference internal"
href="profiling.html">Profiling</a></li>
<li class="toctree-l2"><a class="reference internal"
href="spark-sql-tests.html">Spark SQL Tests</a></li>
<li class="toctree-l2"><a class="reference internal"
href="iceberg-spark-tests.html">Iceberg Spark Tests</a></li>
<li class="toctree-l2"><a class="reference internal"
href="sql-file-tests.html">SQL File Tests</a></li>
diff --git a/contributor-guide/adding_a_new_operator.html
b/contributor-guide/adding_a_new_operator.html
index cf879fec4..cedf83546 100644
--- a/contributor-guide/adding_a_new_operator.html
+++ b/contributor-guide/adding_a_new_operator.html
@@ -366,7 +366,7 @@ under the License.
<li class="toctree-l2 current"><a class="current reference internal"
href="#">Adding a New Operator</a></li>
<li class="toctree-l2"><a class="reference internal"
href="adding_a_new_expression.html">Adding a New Expression</a></li>
<li class="toctree-l2"><a class="reference internal"
href="tracing.html">Tracing</a></li>
-<li class="toctree-l2"><a class="reference internal"
href="profiling_native_code.html">Profiling Native Code</a></li>
+<li class="toctree-l2"><a class="reference internal"
href="profiling.html">Profiling</a></li>
<li class="toctree-l2"><a class="reference internal"
href="spark-sql-tests.html">Spark SQL Tests</a></li>
<li class="toctree-l2"><a class="reference internal"
href="iceberg-spark-tests.html">Iceberg Spark Tests</a></li>
<li class="toctree-l2"><a class="reference internal"
href="sql-file-tests.html">SQL File Tests</a></li>
diff --git a/contributor-guide/benchmarking.html
b/contributor-guide/benchmarking.html
index 2b510f174..f6898f443 100644
--- a/contributor-guide/benchmarking.html
+++ b/contributor-guide/benchmarking.html
@@ -366,7 +366,7 @@ under the License.
<li class="toctree-l2"><a class="reference internal"
href="adding_a_new_operator.html">Adding a New Operator</a></li>
<li class="toctree-l2"><a class="reference internal"
href="adding_a_new_expression.html">Adding a New Expression</a></li>
<li class="toctree-l2"><a class="reference internal"
href="tracing.html">Tracing</a></li>
-<li class="toctree-l2"><a class="reference internal"
href="profiling_native_code.html">Profiling Native Code</a></li>
+<li class="toctree-l2"><a class="reference internal"
href="profiling.html">Profiling</a></li>
<li class="toctree-l2"><a class="reference internal"
href="spark-sql-tests.html">Spark SQL Tests</a></li>
<li class="toctree-l2"><a class="reference internal"
href="iceberg-spark-tests.html">Iceberg Spark Tests</a></li>
<li class="toctree-l2"><a class="reference internal"
href="sql-file-tests.html">SQL File Tests</a></li>
diff --git a/contributor-guide/bug_triage.html
b/contributor-guide/bug_triage.html
index 9b0495322..1435f8bb0 100644
--- a/contributor-guide/bug_triage.html
+++ b/contributor-guide/bug_triage.html
@@ -366,7 +366,7 @@ under the License.
<li class="toctree-l2"><a class="reference internal"
href="adding_a_new_operator.html">Adding a New Operator</a></li>
<li class="toctree-l2"><a class="reference internal"
href="adding_a_new_expression.html">Adding a New Expression</a></li>
<li class="toctree-l2"><a class="reference internal"
href="tracing.html">Tracing</a></li>
-<li class="toctree-l2"><a class="reference internal"
href="profiling_native_code.html">Profiling Native Code</a></li>
+<li class="toctree-l2"><a class="reference internal"
href="profiling.html">Profiling</a></li>
<li class="toctree-l2"><a class="reference internal"
href="spark-sql-tests.html">Spark SQL Tests</a></li>
<li class="toctree-l2"><a class="reference internal"
href="iceberg-spark-tests.html">Iceberg Spark Tests</a></li>
<li class="toctree-l2"><a class="reference internal"
href="sql-file-tests.html">SQL File Tests</a></li>
diff --git a/contributor-guide/contributing.html
b/contributor-guide/contributing.html
index 1c973c2b8..b74c756eb 100644
--- a/contributor-guide/contributing.html
+++ b/contributor-guide/contributing.html
@@ -366,7 +366,7 @@ under the License.
<li class="toctree-l2"><a class="reference internal"
href="adding_a_new_operator.html">Adding a New Operator</a></li>
<li class="toctree-l2"><a class="reference internal"
href="adding_a_new_expression.html">Adding a New Expression</a></li>
<li class="toctree-l2"><a class="reference internal"
href="tracing.html">Tracing</a></li>
-<li class="toctree-l2"><a class="reference internal"
href="profiling_native_code.html">Profiling Native Code</a></li>
+<li class="toctree-l2"><a class="reference internal"
href="profiling.html">Profiling</a></li>
<li class="toctree-l2"><a class="reference internal"
href="spark-sql-tests.html">Spark SQL Tests</a></li>
<li class="toctree-l2"><a class="reference internal"
href="iceberg-spark-tests.html">Iceberg Spark Tests</a></li>
<li class="toctree-l2"><a class="reference internal"
href="sql-file-tests.html">SQL File Tests</a></li>
diff --git a/contributor-guide/debugging.html b/contributor-guide/debugging.html
index 7b43468df..9d1a9dc04 100644
--- a/contributor-guide/debugging.html
+++ b/contributor-guide/debugging.html
@@ -366,7 +366,7 @@ under the License.
<li class="toctree-l2"><a class="reference internal"
href="adding_a_new_operator.html">Adding a New Operator</a></li>
<li class="toctree-l2"><a class="reference internal"
href="adding_a_new_expression.html">Adding a New Expression</a></li>
<li class="toctree-l2"><a class="reference internal"
href="tracing.html">Tracing</a></li>
-<li class="toctree-l2"><a class="reference internal"
href="profiling_native_code.html">Profiling Native Code</a></li>
+<li class="toctree-l2"><a class="reference internal"
href="profiling.html">Profiling</a></li>
<li class="toctree-l2"><a class="reference internal"
href="spark-sql-tests.html">Spark SQL Tests</a></li>
<li class="toctree-l2"><a class="reference internal"
href="iceberg-spark-tests.html">Iceberg Spark Tests</a></li>
<li class="toctree-l2"><a class="reference internal"
href="sql-file-tests.html">SQL File Tests</a></li>
diff --git a/contributor-guide/development.html
b/contributor-guide/development.html
index 4ae3578cb..aa08e72e1 100644
--- a/contributor-guide/development.html
+++ b/contributor-guide/development.html
@@ -366,7 +366,7 @@ under the License.
<li class="toctree-l2"><a class="reference internal"
href="adding_a_new_operator.html">Adding a New Operator</a></li>
<li class="toctree-l2"><a class="reference internal"
href="adding_a_new_expression.html">Adding a New Expression</a></li>
<li class="toctree-l2"><a class="reference internal"
href="tracing.html">Tracing</a></li>
-<li class="toctree-l2"><a class="reference internal"
href="profiling_native_code.html">Profiling Native Code</a></li>
+<li class="toctree-l2"><a class="reference internal"
href="profiling.html">Profiling</a></li>
<li class="toctree-l2"><a class="reference internal"
href="spark-sql-tests.html">Spark SQL Tests</a></li>
<li class="toctree-l2"><a class="reference internal"
href="iceberg-spark-tests.html">Iceberg Spark Tests</a></li>
<li class="toctree-l2"><a class="reference internal"
href="sql-file-tests.html">SQL File Tests</a></li>
diff --git a/contributor-guide/ffi.html b/contributor-guide/ffi.html
index 7374110be..51e957439 100644
--- a/contributor-guide/ffi.html
+++ b/contributor-guide/ffi.html
@@ -366,7 +366,7 @@ under the License.
<li class="toctree-l2"><a class="reference internal"
href="adding_a_new_operator.html">Adding a New Operator</a></li>
<li class="toctree-l2"><a class="reference internal"
href="adding_a_new_expression.html">Adding a New Expression</a></li>
<li class="toctree-l2"><a class="reference internal"
href="tracing.html">Tracing</a></li>
-<li class="toctree-l2"><a class="reference internal"
href="profiling_native_code.html">Profiling Native Code</a></li>
+<li class="toctree-l2"><a class="reference internal"
href="profiling.html">Profiling</a></li>
<li class="toctree-l2"><a class="reference internal"
href="spark-sql-tests.html">Spark SQL Tests</a></li>
<li class="toctree-l2"><a class="reference internal"
href="iceberg-spark-tests.html">Iceberg Spark Tests</a></li>
<li class="toctree-l2"><a class="reference internal"
href="sql-file-tests.html">SQL File Tests</a></li>
diff --git a/contributor-guide/iceberg-spark-tests.html
b/contributor-guide/iceberg-spark-tests.html
index d25ff1841..16870fe0d 100644
--- a/contributor-guide/iceberg-spark-tests.html
+++ b/contributor-guide/iceberg-spark-tests.html
@@ -366,7 +366,7 @@ under the License.
<li class="toctree-l2"><a class="reference internal"
href="adding_a_new_operator.html">Adding a New Operator</a></li>
<li class="toctree-l2"><a class="reference internal"
href="adding_a_new_expression.html">Adding a New Expression</a></li>
<li class="toctree-l2"><a class="reference internal"
href="tracing.html">Tracing</a></li>
-<li class="toctree-l2"><a class="reference internal"
href="profiling_native_code.html">Profiling Native Code</a></li>
+<li class="toctree-l2"><a class="reference internal"
href="profiling.html">Profiling</a></li>
<li class="toctree-l2"><a class="reference internal"
href="spark-sql-tests.html">Spark SQL Tests</a></li>
<li class="toctree-l2 current"><a class="current reference internal"
href="#">Iceberg Spark Tests</a></li>
<li class="toctree-l2"><a class="reference internal"
href="sql-file-tests.html">SQL File Tests</a></li>
diff --git a/contributor-guide/index.html b/contributor-guide/index.html
index a10a751da..53e7ea64d 100644
--- a/contributor-guide/index.html
+++ b/contributor-guide/index.html
@@ -366,7 +366,7 @@ under the License.
<li class="toctree-l2"><a class="reference internal"
href="adding_a_new_operator.html">Adding a New Operator</a></li>
<li class="toctree-l2"><a class="reference internal"
href="adding_a_new_expression.html">Adding a New Expression</a></li>
<li class="toctree-l2"><a class="reference internal"
href="tracing.html">Tracing</a></li>
-<li class="toctree-l2"><a class="reference internal"
href="profiling_native_code.html">Profiling Native Code</a></li>
+<li class="toctree-l2"><a class="reference internal"
href="profiling.html">Profiling</a></li>
<li class="toctree-l2"><a class="reference internal"
href="spark-sql-tests.html">Spark SQL Tests</a></li>
<li class="toctree-l2"><a class="reference internal"
href="iceberg-spark-tests.html">Iceberg Spark Tests</a></li>
<li class="toctree-l2"><a class="reference internal"
href="sql-file-tests.html">SQL File Tests</a></li>
@@ -559,9 +559,12 @@ under the License.
<li class="toctree-l2"><a class="reference internal"
href="tracing.html#definition-of-labels">Definition of Labels</a></li>
</ul>
</li>
-<li class="toctree-l1"><a class="reference internal"
href="profiling_native_code.html">Profiling Native Code</a><ul>
-<li class="toctree-l2"><a class="reference internal"
href="profiling_native_code.html#running-micro-benchmarks-with-cargo-bench">Running
micro benchmarks with cargo bench</a></li>
-<li class="toctree-l2"><a class="reference internal"
href="profiling_native_code.html#profiling-with-cargo-flamegraph">Profiling
with cargo-flamegraph</a></li>
+<li class="toctree-l1"><a class="reference internal"
href="profiling.html">Profiling</a><ul>
+<li class="toctree-l2"><a class="reference internal"
href="profiling.html#choosing-a-profiling-tool">Choosing a Profiling
Tool</a></li>
+<li class="toctree-l2"><a class="reference internal"
href="profiling.html#profiling-with-async-profiler">Profiling with
async-profiler</a></li>
+<li class="toctree-l2"><a class="reference internal"
href="profiling.html#profiling-with-java-flight-recorder">Profiling with Java
Flight Recorder</a></li>
+<li class="toctree-l2"><a class="reference internal"
href="profiling.html#profiling-native-code-with-cargo-flamegraph">Profiling
Native Code with cargo-flamegraph</a></li>
+<li class="toctree-l2"><a class="reference internal"
href="profiling.html#tips-for-profiling-comet">Tips for Profiling Comet</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal"
href="spark-sql-tests.html">Spark SQL Tests</a><ul>
diff --git a/contributor-guide/jvm_shuffle.html
b/contributor-guide/jvm_shuffle.html
index 6a970e901..31f3c9f16 100644
--- a/contributor-guide/jvm_shuffle.html
+++ b/contributor-guide/jvm_shuffle.html
@@ -366,7 +366,7 @@ under the License.
<li class="toctree-l2"><a class="reference internal"
href="adding_a_new_operator.html">Adding a New Operator</a></li>
<li class="toctree-l2"><a class="reference internal"
href="adding_a_new_expression.html">Adding a New Expression</a></li>
<li class="toctree-l2"><a class="reference internal"
href="tracing.html">Tracing</a></li>
-<li class="toctree-l2"><a class="reference internal"
href="profiling_native_code.html">Profiling Native Code</a></li>
+<li class="toctree-l2"><a class="reference internal"
href="profiling.html">Profiling</a></li>
<li class="toctree-l2"><a class="reference internal"
href="spark-sql-tests.html">Spark SQL Tests</a></li>
<li class="toctree-l2"><a class="reference internal"
href="iceberg-spark-tests.html">Iceberg Spark Tests</a></li>
<li class="toctree-l2"><a class="reference internal"
href="sql-file-tests.html">SQL File Tests</a></li>
diff --git a/contributor-guide/native_shuffle.html
b/contributor-guide/native_shuffle.html
index 226188e79..3a50cc8a4 100644
--- a/contributor-guide/native_shuffle.html
+++ b/contributor-guide/native_shuffle.html
@@ -366,7 +366,7 @@ under the License.
<li class="toctree-l2"><a class="reference internal"
href="adding_a_new_operator.html">Adding a New Operator</a></li>
<li class="toctree-l2"><a class="reference internal"
href="adding_a_new_expression.html">Adding a New Expression</a></li>
<li class="toctree-l2"><a class="reference internal"
href="tracing.html">Tracing</a></li>
-<li class="toctree-l2"><a class="reference internal"
href="profiling_native_code.html">Profiling Native Code</a></li>
+<li class="toctree-l2"><a class="reference internal"
href="profiling.html">Profiling</a></li>
<li class="toctree-l2"><a class="reference internal"
href="spark-sql-tests.html">Spark SQL Tests</a></li>
<li class="toctree-l2"><a class="reference internal"
href="iceberg-spark-tests.html">Iceberg Spark Tests</a></li>
<li class="toctree-l2"><a class="reference internal"
href="sql-file-tests.html">SQL File Tests</a></li>
diff --git a/contributor-guide/parquet_scans.html
b/contributor-guide/parquet_scans.html
index 9cc9a8c0a..7e5c5cbfd 100644
--- a/contributor-guide/parquet_scans.html
+++ b/contributor-guide/parquet_scans.html
@@ -366,7 +366,7 @@ under the License.
<li class="toctree-l2"><a class="reference internal"
href="adding_a_new_operator.html">Adding a New Operator</a></li>
<li class="toctree-l2"><a class="reference internal"
href="adding_a_new_expression.html">Adding a New Expression</a></li>
<li class="toctree-l2"><a class="reference internal"
href="tracing.html">Tracing</a></li>
-<li class="toctree-l2"><a class="reference internal"
href="profiling_native_code.html">Profiling Native Code</a></li>
+<li class="toctree-l2"><a class="reference internal"
href="profiling.html">Profiling</a></li>
<li class="toctree-l2"><a class="reference internal"
href="spark-sql-tests.html">Spark SQL Tests</a></li>
<li class="toctree-l2"><a class="reference internal"
href="iceberg-spark-tests.html">Iceberg Spark Tests</a></li>
<li class="toctree-l2"><a class="reference internal"
href="sql-file-tests.html">SQL File Tests</a></li>
diff --git a/contributor-guide/plugin_overview.html
b/contributor-guide/plugin_overview.html
index 4db945e54..27d862c73 100644
--- a/contributor-guide/plugin_overview.html
+++ b/contributor-guide/plugin_overview.html
@@ -366,7 +366,7 @@ under the License.
<li class="toctree-l2"><a class="reference internal"
href="adding_a_new_operator.html">Adding a New Operator</a></li>
<li class="toctree-l2"><a class="reference internal"
href="adding_a_new_expression.html">Adding a New Expression</a></li>
<li class="toctree-l2"><a class="reference internal"
href="tracing.html">Tracing</a></li>
-<li class="toctree-l2"><a class="reference internal"
href="profiling_native_code.html">Profiling Native Code</a></li>
+<li class="toctree-l2"><a class="reference internal"
href="profiling.html">Profiling</a></li>
<li class="toctree-l2"><a class="reference internal"
href="spark-sql-tests.html">Spark SQL Tests</a></li>
<li class="toctree-l2"><a class="reference internal"
href="iceberg-spark-tests.html">Iceberg Spark Tests</a></li>
<li class="toctree-l2"><a class="reference internal"
href="sql-file-tests.html">SQL File Tests</a></li>
diff --git a/contributor-guide/profiling_native_code.html
b/contributor-guide/profiling.html
similarity index 52%
rename from contributor-guide/profiling_native_code.html
rename to contributor-guide/profiling.html
index a34d608c1..1a5bfe4d9 100644
--- a/contributor-guide/profiling_native_code.html
+++ b/contributor-guide/profiling.html
@@ -27,7 +27,7 @@ under the License.
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0"
/><meta name="viewport" content="width=device-width, initial-scale=1" />
- <title>Profiling Native Code — Apache DataFusion Comet
documentation</title>
+ <title>Profiling — Apache DataFusion Comet documentation</title>
@@ -61,7 +61,7 @@ under the License.
<script src="../_static/documentation_options.js?v=5929fcd5"></script>
<script src="../_static/doctools.js?v=9a2dae69"></script>
<script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
- <script>DOCUMENTATION_OPTIONS.pagename =
'contributor-guide/profiling_native_code';</script>
+ <script>DOCUMENTATION_OPTIONS.pagename =
'contributor-guide/profiling';</script>
<script async="true" defer="true"
src="https://buttons.github.io/buttons.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
@@ -366,7 +366,7 @@ under the License.
<li class="toctree-l2"><a class="reference internal"
href="adding_a_new_operator.html">Adding a New Operator</a></li>
<li class="toctree-l2"><a class="reference internal"
href="adding_a_new_expression.html">Adding a New Expression</a></li>
<li class="toctree-l2"><a class="reference internal"
href="tracing.html">Tracing</a></li>
-<li class="toctree-l2 current"><a class="current reference internal"
href="#">Profiling Native Code</a></li>
+<li class="toctree-l2 current"><a class="current reference internal"
href="#">Profiling</a></li>
<li class="toctree-l2"><a class="reference internal"
href="spark-sql-tests.html">Spark SQL Tests</a></li>
<li class="toctree-l2"><a class="reference internal"
href="iceberg-spark-tests.html">Iceberg Spark Tests</a></li>
<li class="toctree-l2"><a class="reference internal"
href="sql-file-tests.html">SQL File Tests</a></li>
@@ -422,7 +422,7 @@ under the License.
<li class="breadcrumb-item"><a href="index.html" class="nav-link">Comet
Contributor Guide</a></li>
- <li class="breadcrumb-item active" aria-current="page"><span
class="ellipsis">Profiling Native Code</span></li>
+ <li class="breadcrumb-item active" aria-current="page"><span
class="ellipsis">Profiling</span></li>
</ul>
</nav>
</div>
@@ -457,12 +457,243 @@ KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
-<section id="profiling-native-code">
-<h1>Profiling Native Code<a class="headerlink" href="#profiling-native-code"
title="Link to this heading">#</a></h1>
-<p>We use <code class="docutils literal notranslate"><span
class="pre">cargo</span> <span class="pre">bench</span></code> to run
benchmarks to measure the performance of individual operators and expressions
-and <a class="reference external"
href="https://github.com/flamegraph-rs/flamegraph">cargo-flamegraph</a> for
profiling.</p>
+<section id="profiling">
+<h1>Profiling<a class="headerlink" href="#profiling" title="Link to this
heading">#</a></h1>
+<p>This guide covers profiling tools and techniques for Comet development.
Because Comet
+spans JVM (Spark) and native (Rust) code, choosing the right profiler depends
on what
+you are investigating.</p>
+<section id="choosing-a-profiling-tool">
+<h2>Choosing a Profiling Tool<a class="headerlink"
href="#choosing-a-profiling-tool" title="Link to this heading">#</a></h2>
+<div class="pst-scrollable-table-container"><table class="table">
+<thead>
+<tr class="row-odd"><th class="head"><p>Tool</p></th>
+<th class="head"><p>JVM Frames</p></th>
+<th class="head"><p>Native (Rust) Frames</p></th>
+<th class="head"><p>Install Required</p></th>
+<th class="head"><p>Best For</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-even"><td><p><a class="reference external"
href="https://github.com/async-profiler/async-profiler">async-profiler</a></p></td>
+<td><p>Yes</p></td>
+<td><p>Yes</p></td>
+<td><p>Yes</p></td>
+<td><p>End-to-end Comet profiling with unified JVM + native flame
graphs</p></td>
+</tr>
+<tr class="row-odd"><td><p><a class="reference external"
href="https://docs.oracle.com/en/java/javase/17/jfapi/">Java Flight Recorder
(JFR)</a></p></td>
+<td><p>Yes</p></td>
+<td><p>No</p></td>
+<td><p>No (JDK 11+)</p></td>
+<td><p>GC pressure, allocations, thread contention, I/O — any JVM-level
investigation</p></td>
+</tr>
+<tr class="row-even"><td><p><a class="reference external"
href="https://github.com/flamegraph-rs/flamegraph">cargo-flamegraph</a></p></td>
+<td><p>No</p></td>
+<td><p>Yes</p></td>
+<td><p>Yes</p></td>
+<td><p>Isolated Rust micro-benchmarks without a JVM</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<p><strong>Recommendation:</strong> Use <strong>async-profiler</strong> when
profiling Spark queries with Comet enabled —
+it is the only tool that shows both JVM and native frames in a single flame
graph.
+Use <strong>JFR</strong> when you need rich JVM event data (GC, locks, I/O)
without installing anything.
+Use <strong>cargo-flamegraph</strong> when working on native code in isolation
via <code class="docutils literal notranslate"><span class="pre">cargo</span>
<span class="pre">bench</span></code>.</p>
+</section>
+<section id="profiling-with-async-profiler">
+<h2>Profiling with async-profiler<a class="headerlink"
href="#profiling-with-async-profiler" title="Link to this heading">#</a></h2>
+<p><a class="reference external"
href="https://github.com/async-profiler/async-profiler">async-profiler</a>
captures JVM and
+native code in the same flame graph by using Linux <code class="docutils
literal notranslate"><span class="pre">perf_events</span></code> or macOS <code
class="docutils literal notranslate"><span class="pre">dtrace</span></code>.
+This makes it ideal for profiling Comet, where hot paths cross the JNI
boundary between
+Spark and Rust.</p>
+<section id="installation">
+<h3>Installation<a class="headerlink" href="#installation" title="Link to this
heading">#</a></h3>
+<p>Download a release from the <a class="reference external"
href="https://github.com/async-profiler/async-profiler/releases">async-profiler
releases page</a>:</p>
+<div class="highlight-shell notranslate"><div
class="highlight"><pre><span></span><span class="c1"># Linux x64</span>
+wget<span class="w">
</span>https://github.com/async-profiler/async-profiler/releases/download/v3.0/async-profiler-3.0-linux-x64.tar.gz
+mkdir<span class="w"> </span>-p<span class="w"> </span><span
class="nv">$HOME</span>/opt/async-profiler
+tar<span class="w"> </span>xzf<span class="w">
</span>async-profiler-3.0-linux-x64.tar.gz<span class="w"> </span>-C<span
class="w"> </span><span class="nv">$HOME</span>/opt/async-profiler<span
class="w"> </span>--strip-components<span class="o">=</span><span
class="m">1</span>
+<span class="nb">export</span><span class="w"> </span><span
class="nv">ASYNC_PROFILER_HOME</span><span class="o">=</span><span
class="nv">$HOME</span>/opt/async-profiler
+</pre></div>
+</div>
+<p>On macOS, download the appropriate <code class="docutils literal
notranslate"><span class="pre">macos</span></code> archive instead.</p>
+</section>
+<section id="attaching-to-a-running-spark-application">
+<h3>Attaching to a running Spark application<a class="headerlink"
href="#attaching-to-a-running-spark-application" title="Link to this
heading">#</a></h3>
+<p>Use the <code class="docutils literal notranslate"><span
class="pre">asprof</span></code> launcher to attach to a running JVM by PID:</p>
+<div class="highlight-shell notranslate"><div
class="highlight"><pre><span></span><span class="c1"># Start CPU profiling for
30 seconds, output an HTML flame graph</span>
+<span class="nv">$ASYNC_PROFILER_HOME</span>/bin/asprof<span class="w">
</span>-d<span class="w"> </span><span class="m">30</span><span class="w">
</span>-f<span class="w"> </span>flamegraph.html<span class="w">
</span><pid>
+
+<span class="c1"># Wall-clock profiling</span>
+<span class="nv">$ASYNC_PROFILER_HOME</span>/bin/asprof<span class="w">
</span>-e<span class="w"> </span>wall<span class="w"> </span>-d<span class="w">
</span><span class="m">30</span><span class="w"> </span>-f<span class="w">
</span>flamegraph.html<span class="w"> </span><pid>
+
+<span class="c1"># Start profiling (no duration limit), then stop later</span>
+<span class="nv">$ASYNC_PROFILER_HOME</span>/bin/asprof<span class="w">
</span>start<span class="w"> </span>-e<span class="w"> </span>cpu<span
class="w"> </span><pid>
+<span class="c1"># ... run your query ...</span>
+<span class="nv">$ASYNC_PROFILER_HOME</span>/bin/asprof<span class="w">
</span>stop<span class="w"> </span>-f<span class="w">
</span>flamegraph.html<span class="w"> </span><pid>
+</pre></div>
+</div>
+<p>Find the Spark driver/executor PID with <code class="docutils literal
notranslate"><span class="pre">jps</span></code> or <code class="docutils
literal notranslate"><span class="pre">pgrep</span> <span class="pre">-f</span>
<span class="pre">SparkSubmit</span></code>.</p>
+</section>
+<section id="passing-profiler-flags-via-spark-submit">
+<h3>Passing profiler flags via spark-submit<a class="headerlink"
href="#passing-profiler-flags-via-spark-submit" title="Link to this
heading">#</a></h3>
+<p>You can also attach async-profiler as a Java agent at JVM startup:</p>
+<div class="highlight-shell notranslate"><div
class="highlight"><pre><span></span>spark-submit<span class="w"> </span><span
class="se">\</span>
+<span class="w"> </span>--conf<span class="w"> </span><span
class="s2">"spark.driver.extraJavaOptions=-agentpath:</span><span
class="nv">$ASYNC_PROFILER_HOME</span><span
class="s2">/lib/libasyncProfiler.so=start,event=cpu,file=driver.html,tree"</span><span
class="w"> </span><span class="se">\</span>
+<span class="w"> </span>--conf<span class="w"> </span><span
class="s2">"spark.executor.extraJavaOptions=-agentpath:</span><span
class="nv">$ASYNC_PROFILER_HOME</span><span
class="s2">/lib/libasyncProfiler.so=start,event=cpu,file=executor.html,tree"</span><span
class="w"> </span><span class="se">\</span>
+<span class="w"> </span>...
+</pre></div>
+</div>
+<p>Note: If the executor is distributed then <code class="docutils literal
notranslate"><span class="pre">executor.html</span></code> will be written on
the remote node.</p>
+</section>
+<section id="choosing-an-event-type">
+<h3>Choosing an event type<a class="headerlink" href="#choosing-an-event-type"
title="Link to this heading">#</a></h3>
+<div class="pst-scrollable-table-container"><table class="table">
+<thead>
+<tr class="row-odd"><th class="head"><p>Event</p></th>
+<th class="head"><p>When to use</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-even"><td><p><code class="docutils literal notranslate"><span
class="pre">cpu</span></code></p></td>
+<td><p>Default. Shows where CPU cycles are spent. Use for compute-bound
queries.</p></td>
+</tr>
+<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span
class="pre">wall</span></code></p></td>
+<td><p>Wall-clock time including blocked/waiting threads. Use to find JNI
boundary overhead and I/O stalls.</p></td>
+</tr>
+<tr class="row-even"><td><p><code class="docutils literal notranslate"><span
class="pre">alloc</span></code></p></td>
+<td><p>Heap allocation profiling. Use to find JVM allocation hotspots around
Arrow FFI and columnar conversions.</p></td>
+</tr>
+<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span
class="pre">lock</span></code></p></td>
+<td><p>Lock contention. Use when threads appear to spend time waiting on
synchronized blocks or locks.</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+</section>
+<section id="output-formats">
+<h3>Output formats<a class="headerlink" href="#output-formats" title="Link to
this heading">#</a></h3>
+<div class="pst-scrollable-table-container"><table class="table">
+<thead>
+<tr class="row-odd"><th class="head"><p>Format</p></th>
+<th class="head"><p>Flag</p></th>
+<th class="head"><p>Description</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-even"><td><p>HTML flame graph</p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">-f</span>
<span class="pre">out.html</span></code></p></td>
+<td><p>Interactive flame graph (default and most useful).</p></td>
+</tr>
+<tr class="row-odd"><td><p>JFR</p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">-f</span>
<span class="pre">out.jfr</span></code></p></td>
+<td><p>Viewable in JDK Mission Control or IntelliJ.</p></td>
+</tr>
+<tr class="row-even"><td><p>Collapsed stacks</p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">-f</span>
<span class="pre">out.collapsed</span></code></p></td>
+<td><p>For use with Brendan Gregg’s FlameGraph scripts.</p></td>
+</tr>
+<tr class="row-odd"><td><p>Text summary</p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">-o</span>
<span class="pre">text</span></code></p></td>
+<td><p>Flat list of hot methods.</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+</section>
+<section id="platform-notes">
+<h3>Platform notes<a class="headerlink" href="#platform-notes" title="Link to
this heading">#</a></h3>
+<p><strong>Linux:</strong> Set <code class="docutils literal
notranslate"><span class="pre">perf_event_paranoid</span></code> to allow
profiling:</p>
+<div class="highlight-shell notranslate"><div
class="highlight"><pre><span></span>sudo<span class="w"> </span>sysctl<span
class="w"> </span>kernel.perf_event_paranoid<span class="o">=</span><span
class="m">1</span><span class="w"> </span><span class="c1"># or 0 / -1 for
full access</span>
+sudo<span class="w"> </span>sysctl<span class="w">
</span>kernel.kptr_restrict<span class="o">=</span><span
class="m">0</span><span class="w"> </span><span class="c1"># optional:
enable kernel symbols</span>
+</pre></div>
+</div>
+<p><strong>macOS:</strong> async-profiler uses <code class="docutils literal
notranslate"><span class="pre">dtrace</span></code> on macOS, which requires
running as root or
+with SIP (System Integrity Protection) adjustments. Native Rust frames may not
be fully
+resolved on macOS; Linux is recommended for the most complete flame graphs.</p>
+</section>
+<section id="integrated-benchmark-profiling">
+<h3>Integrated benchmark profiling<a class="headerlink"
href="#integrated-benchmark-profiling" title="Link to this heading">#</a></h3>
+<p>The TPC benchmark scripts in <code class="docutils literal
notranslate"><span class="pre">benchmarks/tpc/</span></code> have built-in
async-profiler support via
+the <code class="docutils literal notranslate"><span
class="pre">--async-profiler</span></code> flag. See <a class="reference
external"
href="https://github.com/apache/datafusion-comet/blob/main/benchmarks/tpc/README.md">benchmarks/tpc/README.md</a>
+for details.</p>
+</section>
+</section>
+<section id="profiling-with-java-flight-recorder">
+<h2>Profiling with Java Flight Recorder<a class="headerlink"
href="#profiling-with-java-flight-recorder" title="Link to this
heading">#</a></h2>
+<p><a class="reference external"
href="https://docs.oracle.com/en/java/javase/17/jfapi/">Java Flight Recorder
(JFR)</a> is built
+into JDK 11+ and collects detailed JVM runtime data with very low overhead. It
does not
+see native Rust frames, but is excellent for diagnosing GC pressure, thread
contention,
+I/O latency, and JVM-level allocation patterns.</p>
+<section id="adding-jfr-flags-to-spark-submit">
+<h3>Adding JFR flags to spark-submit<a class="headerlink"
href="#adding-jfr-flags-to-spark-submit" title="Link to this heading">#</a></h3>
+<div class="highlight-shell notranslate"><div
class="highlight"><pre><span></span>spark-submit<span class="w"> </span><span
class="se">\</span>
+<span class="w"> </span>--conf<span class="w"> </span><span
class="s2">"spark.driver.extraJavaOptions=-XX:StartFlightRecording=duration=120s,filename=driver.jfr"</span><span
class="w"> </span><span class="se">\</span>
+<span class="w"> </span>--conf<span class="w"> </span><span
class="s2">"spark.executor.extraJavaOptions=-XX:StartFlightRecording=duration=120s,filename=executor.jfr"</span><span
class="w"> </span><span class="se">\</span>
+<span class="w"> </span>...
+</pre></div>
+</div>
+<p>For continuous recording without a fixed duration:</p>
+<div class="highlight-shell notranslate"><div
class="highlight"><pre><span></span>--conf<span class="w"> </span><span
class="s2">"spark.driver.extraJavaOptions=-XX:StartFlightRecording=disk=true,maxsize=500m,filename=driver.jfr"</span>
+</pre></div>
+</div>
+<p>You can also start and stop recording dynamically using <code
class="docutils literal notranslate"><span class="pre">jcmd</span></code>:</p>
+<div class="highlight-shell notranslate"><div
class="highlight"><pre><span></span>jcmd<span class="w">
</span><pid><span class="w"> </span>JFR.start<span class="w">
</span><span class="nv">name</span><span class="o">=</span>profile
+<span class="c1"># ... run your query ...</span>
+jcmd<span class="w"> </span><pid><span class="w"> </span>JFR.stop<span
class="w"> </span><span class="nv">name</span><span
class="o">=</span>profile<span class="w"> </span><span
class="nv">filename</span><span class="o">=</span>recording.jfr
+</pre></div>
+</div>
+</section>
+<section id="viewing-recordings">
+<h3>Viewing recordings<a class="headerlink" href="#viewing-recordings"
title="Link to this heading">#</a></h3>
+<ul class="simple">
+<li><p><strong><a class="reference external"
href="https://jdk.java.net/jmc/">JDK Mission Control (JMC)</a></strong> — the
most comprehensive viewer.
+Shows flame graphs, GC timeline, thread activity, I/O, and allocation hot
spots.</p></li>
+<li><p><strong>IntelliJ IDEA</strong> — open <code class="docutils literal
notranslate"><span class="pre">.jfr</span></code> files directly in the
built-in profiler
+(Run → Open Profiler Snapshot).</p></li>
+<li><p><strong><code class="docutils literal notranslate"><span
class="pre">jfr</span></code> CLI</strong> — quick summaries from the command
line: <code class="docutils literal notranslate"><span class="pre">jfr</span>
<span class="pre">summary</span> <span
class="pre">driver.jfr</span></code></p></li>
+</ul>
+</section>
+<section id="useful-jfr-events-for-comet-debugging">
+<h3>Useful JFR events for Comet debugging<a class="headerlink"
href="#useful-jfr-events-for-comet-debugging" title="Link to this
heading">#</a></h3>
+<div class="pst-scrollable-table-container"><table class="table">
+<thead>
+<tr class="row-odd"><th class="head"><p>Event</p></th>
+<th class="head"><p>What it shows</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-even"><td><p><code class="docutils literal notranslate"><span
class="pre">jdk.GCPhasePause</span></code></p></td>
+<td><p>GC pause durations — helps identify memory pressure from Arrow
allocations.</p></td>
+</tr>
+<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span
class="pre">jdk.ObjectAllocationInNewTLAB</span></code> / <code class="docutils
literal notranslate"><span
class="pre">jdk.ObjectAllocationOutsideTLAB</span></code></p></td>
+<td><p>Allocation hot spots.</p></td>
+</tr>
+<tr class="row-even"><td><p><code class="docutils literal notranslate"><span
class="pre">jdk.JavaMonitorWait</span></code> / <code class="docutils literal
notranslate"><span class="pre">jdk.ThreadPark</span></code></p></td>
+<td><p>Thread contention and lock waits.</p></td>
+</tr>
+<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span
class="pre">jdk.FileRead</span></code> / <code class="docutils literal
notranslate"><span class="pre">jdk.FileWrite</span></code> / <code
class="docutils literal notranslate"><span
class="pre">jdk.SocketRead</span></code></p></td>
+<td><p>I/O latency.</p></td>
+</tr>
+<tr class="row-even"><td><p><code class="docutils literal notranslate"><span
class="pre">jdk.ExecutionSample</span></code></p></td>
+<td><p>CPU sampling (method profiling, similar to a flame graph).</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+</section>
+<section id="id1">
+<h3>Integrated benchmark profiling<a class="headerlink" href="#id1"
title="Link to this heading">#</a></h3>
+<p>The TPC benchmark scripts support <code class="docutils literal
notranslate"><span class="pre">--jfr</span></code> for automatic JFR recording
during benchmark
+runs. See <a class="reference external"
href="https://github.com/apache/datafusion-comet/blob/main/benchmarks/tpc/README.md">benchmarks/tpc/README.md</a>
for details.</p>
+</section>
+</section>
+<section id="profiling-native-code-with-cargo-flamegraph">
+<h2>Profiling Native Code with cargo-flamegraph<a class="headerlink"
href="#profiling-native-code-with-cargo-flamegraph" title="Link to this
heading">#</a></h2>
+<p>For profiling Rust code in isolation — without a JVM — use <code
class="docutils literal notranslate"><span class="pre">cargo</span> <span
class="pre">bench</span></code> with
+<a class="reference external"
href="https://github.com/flamegraph-rs/flamegraph">cargo-flamegraph</a>.</p>
<section id="running-micro-benchmarks-with-cargo-bench">
-<h2>Running micro benchmarks with cargo bench<a class="headerlink"
href="#running-micro-benchmarks-with-cargo-bench" title="Link to this
heading">#</a></h2>
+<h3>Running micro benchmarks with cargo bench<a class="headerlink"
href="#running-micro-benchmarks-with-cargo-bench" title="Link to this
heading">#</a></h3>
<p>When implementing a new operator or expression, it is good practice to add
a new microbenchmark under <code class="docutils literal notranslate"><span
class="pre">core/benches</span></code>.</p>
<p>It is often easiest to copy an existing benchmark and modify it for the new
operator or expression. It is also
necessary to add a new section to the <code class="docutils literal
notranslate"><span class="pre">Cargo.toml</span></code> file, such as:</p>
@@ -471,7 +702,7 @@ necessary to add a new section to the <code class="docutils
literal notranslate"
<span class="n">harness</span><span class="w"> </span><span
class="o">=</span><span class="w"> </span><span class="kc">false</span>
</pre></div>
</div>
-<p>These benchmarks are useful when for comparing performance between releases
or between feature branches and the
+<p>These benchmarks are useful for comparing performance between releases or
between feature branches and the
main branch to help prevent regressions in performance when adding new
features or fixing bugs.</p>
<p>Individual benchmarks can be run by name with the following command.</p>
<div class="highlight-shell notranslate"><div
class="highlight"><pre><span></span>cargo<span class="w"> </span>bench<span
class="w"> </span>shuffle_writer
@@ -489,7 +720,7 @@ main branch to help prevent regressions in performance when
adding new features
</div>
</section>
<section id="profiling-with-cargo-flamegraph">
-<h2>Profiling with cargo-flamegraph<a class="headerlink"
href="#profiling-with-cargo-flamegraph" title="Link to this heading">#</a></h2>
+<h3>Profiling with cargo-flamegraph<a class="headerlink"
href="#profiling-with-cargo-flamegraph" title="Link to this heading">#</a></h3>
<p>Install cargo-flamegraph:</p>
<div class="highlight-shell notranslate"><div
class="highlight"><pre><span></span>cargo<span class="w"> </span>install<span
class="w"> </span>flamegraph
</pre></div>
@@ -516,6 +747,44 @@ running flamegraph.</p>
<p>Here is the flamegraph for this example:</p>
<p><img alt="flamegraph" src="../_images/flamegraph.png" /></p>
</section>
+</section>
+<section id="tips-for-profiling-comet">
+<h2>Tips for Profiling Comet<a class="headerlink"
href="#tips-for-profiling-comet" title="Link to this heading">#</a></h2>
+<section id="use-wall-clock-profiling-to-spot-jni-boundary-overhead">
+<h3>Use wall-clock profiling to spot JNI boundary overhead<a
class="headerlink"
href="#use-wall-clock-profiling-to-spot-jni-boundary-overhead" title="Link to
this heading">#</a></h3>
+<p>When profiling Comet with async-profiler, <code class="docutils literal
notranslate"><span class="pre">wall</span></code> mode is often more revealing
than <code class="docutils literal notranslate"><span
class="pre">cpu</span></code>
+because it captures time spent crossing the JNI boundary, waiting for native
results,
+and blocked on I/O — none of which show up in CPU-only profiles.</p>
+<div class="highlight-shell notranslate"><div
class="highlight"><pre><span></span><span
class="nv">$ASYNC_PROFILER_HOME</span>/bin/asprof<span class="w">
</span>-e<span class="w"> </span>wall<span class="w"> </span>-d<span class="w">
</span><span class="m">60</span><span class="w"> </span>-f<span class="w">
</span>wall-profile.html<span class="w"> </span><pid>
+</pre></div>
+</div>
+</section>
+<section id="use-alloc-profiling-around-arrow-ffi">
+<h3>Use alloc profiling around Arrow FFI<a class="headerlink"
href="#use-alloc-profiling-around-arrow-ffi" title="Link to this
heading">#</a></h3>
+<p>JVM allocation profiling can identify hotspots in the Arrow FFI path where
temporary
+objects are created during data transfer between JVM and native code:</p>
+<div class="highlight-shell notranslate"><div
class="highlight"><pre><span></span><span
class="nv">$ASYNC_PROFILER_HOME</span>/bin/asprof<span class="w">
</span>-e<span class="w"> </span>alloc<span class="w"> </span>-d<span
class="w"> </span><span class="m">60</span><span class="w"> </span>-f<span
class="w"> </span>alloc-profile.html<span class="w"> </span><pid>
+</pre></div>
+</div>
+<p>Look for allocations in <code class="docutils literal notranslate"><span
class="pre">CometExecIterator</span></code>, <code class="docutils literal
notranslate"><span class="pre">CometBatchIterator</span></code>, and Arrow
vector
+classes.</p>
+</section>
+<section id="isolate-rust-only-performance-issues">
+<h3>Isolate Rust-only performance issues<a class="headerlink"
href="#isolate-rust-only-performance-issues" title="Link to this
heading">#</a></h3>
+<p>If a flame graph shows the hot path is entirely within native code, switch
to
+<code class="docutils literal notranslate"><span
class="pre">cargo-flamegraph</span></code> to get better symbol resolution and
avoid JVM noise:</p>
+<div class="highlight-shell notranslate"><div
class="highlight"><pre><span></span><span class="nb">cd</span><span class="w">
</span>native
+cargo<span class="w"> </span>flamegraph<span class="w"> </span>--root<span
class="w"> </span>--bench<span class="w"> </span><benchmark_name>
+</pre></div>
+</div>
+</section>
+<section id="correlating-jvm-and-native-frames">
+<h3>Correlating JVM and native frames<a class="headerlink"
href="#correlating-jvm-and-native-frames" title="Link to this
heading">#</a></h3>
+<p>In async-profiler flame graphs, native Rust frames appear below JNI entry
points like
+<code class="docutils literal notranslate"><span
class="pre">Java_org_apache_comet_Native_*</span></code>. Look for these
transition points to understand how
+time is split between Spark’s JVM code and Comet’s native execution.</p>
+</section>
+</section>
</section>
diff --git a/contributor-guide/release_process.html
b/contributor-guide/release_process.html
index 4624f65d1..cc1a671be 100644
--- a/contributor-guide/release_process.html
+++ b/contributor-guide/release_process.html
@@ -366,7 +366,7 @@ under the License.
<li class="toctree-l2"><a class="reference internal"
href="adding_a_new_operator.html">Adding a New Operator</a></li>
<li class="toctree-l2"><a class="reference internal"
href="adding_a_new_expression.html">Adding a New Expression</a></li>
<li class="toctree-l2"><a class="reference internal"
href="tracing.html">Tracing</a></li>
-<li class="toctree-l2"><a class="reference internal"
href="profiling_native_code.html">Profiling Native Code</a></li>
+<li class="toctree-l2"><a class="reference internal"
href="profiling.html">Profiling</a></li>
<li class="toctree-l2"><a class="reference internal"
href="spark-sql-tests.html">Spark SQL Tests</a></li>
<li class="toctree-l2"><a class="reference internal"
href="iceberg-spark-tests.html">Iceberg Spark Tests</a></li>
<li class="toctree-l2"><a class="reference internal"
href="sql-file-tests.html">SQL File Tests</a></li>
diff --git a/contributor-guide/roadmap.html b/contributor-guide/roadmap.html
index 9b5f501c1..be82d77ee 100644
--- a/contributor-guide/roadmap.html
+++ b/contributor-guide/roadmap.html
@@ -366,7 +366,7 @@ under the License.
<li class="toctree-l2"><a class="reference internal"
href="adding_a_new_operator.html">Adding a New Operator</a></li>
<li class="toctree-l2"><a class="reference internal"
href="adding_a_new_expression.html">Adding a New Expression</a></li>
<li class="toctree-l2"><a class="reference internal"
href="tracing.html">Tracing</a></li>
-<li class="toctree-l2"><a class="reference internal"
href="profiling_native_code.html">Profiling Native Code</a></li>
+<li class="toctree-l2"><a class="reference internal"
href="profiling.html">Profiling</a></li>
<li class="toctree-l2"><a class="reference internal"
href="spark-sql-tests.html">Spark SQL Tests</a></li>
<li class="toctree-l2"><a class="reference internal"
href="iceberg-spark-tests.html">Iceberg Spark Tests</a></li>
<li class="toctree-l2"><a class="reference internal"
href="sql-file-tests.html">SQL File Tests</a></li>
diff --git a/contributor-guide/spark-sql-tests.html
b/contributor-guide/spark-sql-tests.html
index d0eaad61b..39dda8ced 100644
--- a/contributor-guide/spark-sql-tests.html
+++ b/contributor-guide/spark-sql-tests.html
@@ -66,7 +66,7 @@ under the License.
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
<link rel="next" title="Running Iceberg Spark Tests"
href="iceberg-spark-tests.html" />
- <link rel="prev" title="Profiling Native Code"
href="profiling_native_code.html" />
+ <link rel="prev" title="Profiling" href="profiling.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="en"/>
<meta name="docsearch:version" content="" />
@@ -366,7 +366,7 @@ under the License.
<li class="toctree-l2"><a class="reference internal"
href="adding_a_new_operator.html">Adding a New Operator</a></li>
<li class="toctree-l2"><a class="reference internal"
href="adding_a_new_expression.html">Adding a New Expression</a></li>
<li class="toctree-l2"><a class="reference internal"
href="tracing.html">Tracing</a></li>
-<li class="toctree-l2"><a class="reference internal"
href="profiling_native_code.html">Profiling Native Code</a></li>
+<li class="toctree-l2"><a class="reference internal"
href="profiling.html">Profiling</a></li>
<li class="toctree-l2 current"><a class="current reference internal"
href="#">Spark SQL Tests</a></li>
<li class="toctree-l2"><a class="reference internal"
href="iceberg-spark-tests.html">Iceberg Spark Tests</a></li>
<li class="toctree-l2"><a class="reference internal"
href="sql-file-tests.html">SQL File Tests</a></li>
@@ -608,12 +608,12 @@ new version.</p>
<div class="prev-next-area">
<a class="left-prev"
- href="profiling_native_code.html"
+ href="profiling.html"
title="previous page">
<i class="fa-solid fa-angle-left"></i>
<div class="prev-next-info">
<p class="prev-next-subtitle">previous</p>
- <p class="prev-next-title">Profiling Native Code</p>
+ <p class="prev-next-title">Profiling</p>
</div>
</a>
<a class="right-next"
diff --git a/contributor-guide/sql-file-tests.html
b/contributor-guide/sql-file-tests.html
index 30a817298..ad58a1a85 100644
--- a/contributor-guide/sql-file-tests.html
+++ b/contributor-guide/sql-file-tests.html
@@ -366,7 +366,7 @@ under the License.
<li class="toctree-l2"><a class="reference internal"
href="adding_a_new_operator.html">Adding a New Operator</a></li>
<li class="toctree-l2"><a class="reference internal"
href="adding_a_new_expression.html">Adding a New Expression</a></li>
<li class="toctree-l2"><a class="reference internal"
href="tracing.html">Tracing</a></li>
-<li class="toctree-l2"><a class="reference internal"
href="profiling_native_code.html">Profiling Native Code</a></li>
+<li class="toctree-l2"><a class="reference internal"
href="profiling.html">Profiling</a></li>
<li class="toctree-l2"><a class="reference internal"
href="spark-sql-tests.html">Spark SQL Tests</a></li>
<li class="toctree-l2"><a class="reference internal"
href="iceberg-spark-tests.html">Iceberg Spark Tests</a></li>
<li class="toctree-l2 current"><a class="current reference internal"
href="#">SQL File Tests</a></li>
diff --git a/contributor-guide/tracing.html b/contributor-guide/tracing.html
index 33292f424..6a592950b 100644
--- a/contributor-guide/tracing.html
+++ b/contributor-guide/tracing.html
@@ -65,7 +65,7 @@ under the License.
<script async="true" defer="true"
src="https://buttons.github.io/buttons.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
- <link rel="next" title="Profiling Native Code"
href="profiling_native_code.html" />
+ <link rel="next" title="Profiling" href="profiling.html" />
<link rel="prev" title="Adding a New Expression"
href="adding_a_new_expression.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="en"/>
@@ -366,7 +366,7 @@ under the License.
<li class="toctree-l2"><a class="reference internal"
href="adding_a_new_operator.html">Adding a New Operator</a></li>
<li class="toctree-l2"><a class="reference internal"
href="adding_a_new_expression.html">Adding a New Expression</a></li>
<li class="toctree-l2 current"><a class="current reference internal"
href="#">Tracing</a></li>
-<li class="toctree-l2"><a class="reference internal"
href="profiling_native_code.html">Profiling Native Code</a></li>
+<li class="toctree-l2"><a class="reference internal"
href="profiling.html">Profiling</a></li>
<li class="toctree-l2"><a class="reference internal"
href="spark-sql-tests.html">Spark SQL Tests</a></li>
<li class="toctree-l2"><a class="reference internal"
href="iceberg-spark-tests.html">Iceberg Spark Tests</a></li>
<li class="toctree-l2"><a class="reference internal"
href="sql-file-tests.html">SQL File Tests</a></li>
@@ -530,11 +530,11 @@ directory with the filename <code class="docutils literal
notranslate"><span cla
</div>
</a>
<a class="right-next"
- href="profiling_native_code.html"
+ href="profiling.html"
title="next page">
<div class="prev-next-info">
<p class="prev-next-subtitle">next</p>
- <p class="prev-next-title">Profiling Native Code</p>
+ <p class="prev-next-title">Profiling</p>
</div>
<i class="fa-solid fa-angle-right"></i>
</a>
diff --git a/objects.inv b/objects.inv
index d0d58f9a0..a50c5f1a3 100644
Binary files a/objects.inv and b/objects.inv differ
diff --git a/searchindex.js b/searchindex.js
index 907f9d7f8..d68a8ebf7 100644
--- a/searchindex.js
+++ b/searchindex.js
@@ -1 +1 @@
-Search.setIndex({"alltitles": {"1. Format Your Code": [[13,
"format-your-code"]], "1. Install Comet": [[15, "install-comet"], [24,
"install-comet"]], "1. Native Operators (nativeExecs map)": [[4,
"native-operators-nativeexecs-map"]], "2. Build and Verify": [[13,
"build-and-verify"]], "2. Clone Iceberg and Apply Diff": [[15,
"clone-iceberg-and-apply-diff"]], "2. Clone Spark and Apply Diff": [[24,
"clone-spark-and-apply-diff"]], "2. Sink Operators (sinks map)": [[4,
"sink-operators-sinks-m [...]
\ No newline at end of file
+Search.setIndex({"alltitles": {"1. Format Your Code": [[13,
"format-your-code"]], "1. Install Comet": [[15, "install-comet"], [24,
"install-comet"]], "1. Native Operators (nativeExecs map)": [[4,
"native-operators-nativeexecs-map"]], "2. Build and Verify": [[13,
"build-and-verify"]], "2. Clone Iceberg and Apply Diff": [[15,
"clone-iceberg-and-apply-diff"]], "2. Clone Spark and Apply Diff": [[24,
"clone-spark-and-apply-diff"]], "2. Sink Operators (sinks map)": [[4,
"sink-operators-sinks-m [...]
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]