Skip to content

chore: remove dead Parquet parallel-IO configs - #4981

Merged
mbutrovich merged 1 commit into
apache:mainfrom
andygrove:remove-dead-io-configs
Jul 20, 2026
Merged

chore: remove dead Parquet parallel-IO configs#4981
mbutrovich merged 1 commit into
apache:mainfrom
andygrove:remove-dead-io-configs

Conversation

@andygrove

Copy link
Copy Markdown
Member

Which issue does this PR close?

Partially addresses #4842 (Item #9 in the remediation section: "Delete or implement the dead IO configs (parallel.io.*, mergeRanges) so benchmarking isn't misled").

Rationale for this change

The following configs are defined in CometConf.scala but referenced nowhere in current native or JVM code. They were consumed by the JVM-side Parquet reader that has since been removed:

  • spark.comet.parquet.read.parallel.io.enabled (default true)
  • spark.comet.parquet.read.parallel.io.thread-pool.size (default 16)
  • spark.comet.parquet.read.io.mergeRanges (default true)
  • spark.comet.parquet.read.io.mergeRanges.delta (default 8 MB)
  • spark.comet.parquet.read.io.adjust.readRange.skew (default false)

These are a trap: they appear tunable but change nothing. Anyone benchmarking "Comet with IO tuning" is tuning a no-op.

What changes are included in this PR?

  • Delete the five dead config entries from CometConf.scala.
  • Delete the stale ParquetReadSuite "test merge scan range" test, which only asserted that the (dead) config propagated to the Hadoop conf.

The auto-generated configs.md will be regenerated on the next docs build and will no longer list these entries.

How are these changes tested?

Compile-checked against spark-3.5. No behavior change — these configs were no-ops in current code.

These configs were consumed by the JVM-side Parquet reader that has since
been removed. They are referenced nowhere in current native or JVM code
and mislead operators tuning benchmarks.

Removed configs:
- spark.comet.parquet.read.parallel.io.enabled
- spark.comet.parquet.read.parallel.io.thread-pool.size
- spark.comet.parquet.read.io.mergeRanges
- spark.comet.parquet.read.io.mergeRanges.delta
- spark.comet.parquet.read.io.adjust.readRange.skew

Also removes the stale ParquetReadSuite "test merge scan range" test,
which only asserted that the (dead) config propagated to the Hadoop conf.

Refs apache#4842.
@andygrove
andygrove requested a review from parthchandra July 20, 2026 18:12
@mbutrovich

Copy link
Copy Markdown
Contributor

Can you nab "spark.comet.use.lazyMaterialization" as well?

@mbutrovich

Copy link
Copy Markdown
Contributor

Actually, CI is green, we can get it in a followup.

@mbutrovich mbutrovich left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @andygrove!

@mbutrovich
mbutrovich merged commit b016555 into apache:main Jul 20, 2026
71 checks passed
@andygrove
andygrove deleted the remove-dead-io-configs branch July 20, 2026 18:55
andygrove added a commit to andygrove/datafusion-comet that referenced this pull request Jul 27, 2026
- Remove ### Parallel I/O subsection: the four spark.comet.parquet.read.parallel.io.*
  and .mergeRanges* configs were removed in apache#4981
- Fix maxTempDirectorySize scope: limit is per Spark task, not per executor
- Move ### Parquet Native Scans (merged in from main) under new
  ## Parquet Reader Tuning h2 so all Parquet guidance is co-located
- Promote ### Reducing Row/Columnar Conversion Overhead to its own h2 since
  spark.comet.exec.transitionRevert.* counts C2R transitions across the whole
  stage and is not shuffle-specific
- Clarify shuffle compression: spark.comet.exec.shuffle.compression.codec
  governs both native and JVM columnar shuffle; spark.shuffle.compress=false
  disables compression only for the native shuffle
- Fix Iceberg wording: spark.comet.scan.icebergNative.enabled defaults to true
andygrove added a commit to andygrove/datafusion-comet that referenced this pull request Jul 28, 2026
- Remove ### Parallel I/O subsection: the four spark.comet.parquet.read.parallel.io.*
  and .mergeRanges* configs were removed in apache#4981
- Fix maxTempDirectorySize scope: limit is per Spark task, not per executor
- Move ### Parquet Native Scans (merged in from main) under new
  ## Parquet Reader Tuning h2 so all Parquet guidance is co-located
- Promote ### Reducing Row/Columnar Conversion Overhead to its own h2 since
  spark.comet.exec.transitionRevert.* counts C2R transitions across the whole
  stage and is not shuffle-specific
- Clarify shuffle compression: spark.comet.exec.shuffle.compression.codec
  governs both native and JVM columnar shuffle; spark.shuffle.compress=false
  disables compression only for the native shuffle
- Fix Iceberg wording: spark.comet.scan.icebergNative.enabled defaults to true
andygrove added a commit that referenced this pull request Jul 28, 2026
* refactor: unify shuffle configs under `spark.comet.shuffle.*` prefix

Shuffle-related configs were spread across four disjoint prefixes:
`spark.comet.exec.shuffle.*`, `spark.comet.columnar.shuffle.*`,
`spark.comet.native.shuffle.*`, and `spark.comet.shuffle.*`. This
consolidates all shuffle configs under `spark.comet.shuffle.*` with
`.columnar.` and `.native.` sub-namespaces for mode-specific settings.

Every renamed key is registered via `.withAlternative(...)`, so
existing user configurations continue to work (a deprecation warning
is logged when an old key is read). Per-mode leaves that were
previously misplaced move to their honest namespace:

  - `spark.comet.exec.shuffle.writeBufferSize` (native-only) becomes
    `spark.comet.shuffle.native.writeBufferSize`.
  - `spark.comet.shuffle.preferDictionary.ratio` (JVM-only) becomes
    `spark.comet.shuffle.columnar.preferDictionary.ratio`.

The `spark.comet.columnar.shuffle.*` keys also fix Category 2 in
#4978 (dots-in-segment): `spill.threshold`,
`memory.factor`, and `batch.size` become `spillThreshold`,
`memoryFactor`, and `batchSize`.

Part of #4978.

* refactor: rename `.columnar.` sub-namespace to `.jvm.`

The JVM-side shuffle path in Comet is not the only columnar shuffle —
native shuffle is also columnar (both use Arrow). The distinguishing
axis is *where* the shuffle logic runs. Renaming the sub-namespace
to `.jvm.` aligns it with the mode value users already set:
`spark.comet.shuffle.mode = jvm`.

Keys renamed:

  - spark.comet.shuffle.columnar.spillThreshold        → spark.comet.shuffle.jvm.spillThreshold
  - spark.comet.shuffle.columnar.memoryFactor          → spark.comet.shuffle.jvm.memoryFactor
  - spark.comet.shuffle.columnar.batchSize             → spark.comet.shuffle.jvm.batchSize
  - spark.comet.shuffle.columnar.preferDictionary.ratio → spark.comet.shuffle.jvm.preferDictionary.ratio

The pre-existing deprecated aliases (`spark.comet.columnar.shuffle.*`)
are untouched — they were never `.columnar.`-scoped under the new
prefix. Val names follow: `COMET_SHUFFLE_COLUMNAR_*` → `COMET_SHUFFLE_JVM_*`.

The Scala/Java class names (`CometColumnarShuffle`, `CometColumnarShuffleSuite`, etc.)
still use "columnar" and are left alone — that is a separate rename to
consider once the config vocabulary settles.

* chore: re-run prettier on shuffle docs

Table column alignment tweaks after the `.columnar.` → `.jvm.` key
rename. Content unchanged.

* style: apply spotless formatting to CometShuffleExternalSorter

* refactor: move maxBufferBytes under spark.comet.shuffle.native prefix

* test: update Spark diffs for renamed shuffle configs

Regenerate the Spark SQL test diffs to reference shuffle configs by their
string keys rather than CometConf constants, so the config rename in this
PR no longer breaks test compilation.

- spark.comet.exec.shuffle.enabled -> spark.comet.shuffle.enabled
- CometConf.COMET_EXEC_SHUFFLE_WITH_RANGE_PARTITIONING_ENABLED.key ->
  "spark.comet.shuffle.native.partitioning.range.enabled"

* docs: expand tuning guide with performance and memory configs for 1.0

Audited all CometConf entries and added documentation for user-facing
performance and memory knobs that were undocumented in the tuning guide:
batch size, spill disk cap, Parquet parallel I/O and filter pushdown,
Iceberg data-file concurrency, shuffle compression codec/level,
row/columnar transition revert, and metrics overhead. Also fixed an
incorrect claim about the default shuffle compression codec (LZ4, not
ZSTD) and moved spark.comet.maxTempDirectorySize into the tuning
category so it renders in the Memory & Tuning table.

* style: apply spotless formatting to COMET_MAX_TEMP_DIRECTORY_SIZE doc string

* docs: address review feedback on tuning guide

- Remove ### Parallel I/O subsection: the four spark.comet.parquet.read.parallel.io.*
  and .mergeRanges* configs were removed in #4981
- Fix maxTempDirectorySize scope: limit is per Spark task, not per executor
- Move ### Parquet Native Scans (merged in from main) under new
  ## Parquet Reader Tuning h2 so all Parquet guidance is co-located
- Promote ### Reducing Row/Columnar Conversion Overhead to its own h2 since
  spark.comet.exec.transitionRevert.* counts C2R transitions across the whole
  stage and is not shuffle-specific
- Clarify shuffle compression: spark.comet.exec.shuffle.compression.codec
  governs both native and JVM columnar shuffle; spark.shuffle.compress=false
  disables compression only for the native shuffle
- Fix Iceberg wording: spark.comet.scan.icebergNative.enabled defaults to true

* docs: use renamed shuffle config keys in tuning guide

---------

Co-authored-by: Matt Butrovich <mbutrovich@users.noreply.github.com>
comphead pushed a commit to comphead/arrow-datafusion-comet that referenced this pull request Aug 26, 2026
These configs were consumed by the JVM-side Parquet reader that has since
been removed. They are referenced nowhere in current native or JVM code
and mislead operators tuning benchmarks.

Removed configs:
- spark.comet.parquet.read.parallel.io.enabled
- spark.comet.parquet.read.parallel.io.thread-pool.size
- spark.comet.parquet.read.io.mergeRanges
- spark.comet.parquet.read.io.mergeRanges.delta
- spark.comet.parquet.read.io.adjust.readRange.skew

Also removes the stale ParquetReadSuite "test merge scan range" test,
which only asserted that the (dead) config propagated to the Hadoop conf.

Refs apache#4842.
comphead pushed a commit to comphead/arrow-datafusion-comet that referenced this pull request Aug 26, 2026
…#4908)

* refactor: unify shuffle configs under `spark.comet.shuffle.*` prefix

Shuffle-related configs were spread across four disjoint prefixes:
`spark.comet.exec.shuffle.*`, `spark.comet.columnar.shuffle.*`,
`spark.comet.native.shuffle.*`, and `spark.comet.shuffle.*`. This
consolidates all shuffle configs under `spark.comet.shuffle.*` with
`.columnar.` and `.native.` sub-namespaces for mode-specific settings.

Every renamed key is registered via `.withAlternative(...)`, so
existing user configurations continue to work (a deprecation warning
is logged when an old key is read). Per-mode leaves that were
previously misplaced move to their honest namespace:

  - `spark.comet.exec.shuffle.writeBufferSize` (native-only) becomes
    `spark.comet.shuffle.native.writeBufferSize`.
  - `spark.comet.shuffle.preferDictionary.ratio` (JVM-only) becomes
    `spark.comet.shuffle.columnar.preferDictionary.ratio`.

The `spark.comet.columnar.shuffle.*` keys also fix Category 2 in
apache#4978 (dots-in-segment): `spill.threshold`,
`memory.factor`, and `batch.size` become `spillThreshold`,
`memoryFactor`, and `batchSize`.

Part of apache#4978.

* refactor: rename `.columnar.` sub-namespace to `.jvm.`

The JVM-side shuffle path in Comet is not the only columnar shuffle —
native shuffle is also columnar (both use Arrow). The distinguishing
axis is *where* the shuffle logic runs. Renaming the sub-namespace
to `.jvm.` aligns it with the mode value users already set:
`spark.comet.shuffle.mode = jvm`.

Keys renamed:

  - spark.comet.shuffle.columnar.spillThreshold        → spark.comet.shuffle.jvm.spillThreshold
  - spark.comet.shuffle.columnar.memoryFactor          → spark.comet.shuffle.jvm.memoryFactor
  - spark.comet.shuffle.columnar.batchSize             → spark.comet.shuffle.jvm.batchSize
  - spark.comet.shuffle.columnar.preferDictionary.ratio → spark.comet.shuffle.jvm.preferDictionary.ratio

The pre-existing deprecated aliases (`spark.comet.columnar.shuffle.*`)
are untouched — they were never `.columnar.`-scoped under the new
prefix. Val names follow: `COMET_SHUFFLE_COLUMNAR_*` → `COMET_SHUFFLE_JVM_*`.

The Scala/Java class names (`CometColumnarShuffle`, `CometColumnarShuffleSuite`, etc.)
still use "columnar" and are left alone — that is a separate rename to
consider once the config vocabulary settles.

* chore: re-run prettier on shuffle docs

Table column alignment tweaks after the `.columnar.` → `.jvm.` key
rename. Content unchanged.

* style: apply spotless formatting to CometShuffleExternalSorter

* refactor: move maxBufferBytes under spark.comet.shuffle.native prefix

* test: update Spark diffs for renamed shuffle configs

Regenerate the Spark SQL test diffs to reference shuffle configs by their
string keys rather than CometConf constants, so the config rename in this
PR no longer breaks test compilation.

- spark.comet.exec.shuffle.enabled -> spark.comet.shuffle.enabled
- CometConf.COMET_EXEC_SHUFFLE_WITH_RANGE_PARTITIONING_ENABLED.key ->
  "spark.comet.shuffle.native.partitioning.range.enabled"

* docs: expand tuning guide with performance and memory configs for 1.0

Audited all CometConf entries and added documentation for user-facing
performance and memory knobs that were undocumented in the tuning guide:
batch size, spill disk cap, Parquet parallel I/O and filter pushdown,
Iceberg data-file concurrency, shuffle compression codec/level,
row/columnar transition revert, and metrics overhead. Also fixed an
incorrect claim about the default shuffle compression codec (LZ4, not
ZSTD) and moved spark.comet.maxTempDirectorySize into the tuning
category so it renders in the Memory & Tuning table.

* style: apply spotless formatting to COMET_MAX_TEMP_DIRECTORY_SIZE doc string

* docs: address review feedback on tuning guide

- Remove ### Parallel I/O subsection: the four spark.comet.parquet.read.parallel.io.*
  and .mergeRanges* configs were removed in apache#4981
- Fix maxTempDirectorySize scope: limit is per Spark task, not per executor
- Move ### Parquet Native Scans (merged in from main) under new
  ## Parquet Reader Tuning h2 so all Parquet guidance is co-located
- Promote ### Reducing Row/Columnar Conversion Overhead to its own h2 since
  spark.comet.exec.transitionRevert.* counts C2R transitions across the whole
  stage and is not shuffle-specific
- Clarify shuffle compression: spark.comet.exec.shuffle.compression.codec
  governs both native and JVM columnar shuffle; spark.shuffle.compress=false
  disables compression only for the native shuffle
- Fix Iceberg wording: spark.comet.scan.icebergNative.enabled defaults to true

* docs: use renamed shuffle config keys in tuning guide

---------

Co-authored-by: Matt Butrovich <mbutrovich@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants