Skip to content

[GLUTEN-12807][CORE] Deprecate and remove Spark 3.3 support - #12902

Open
LuciferYang wants to merge 10 commits into
apache:mainfrom
LuciferYang:spark33-drop-p1-remove
Open

[GLUTEN-12807][CORE] Deprecate and remove Spark 3.3 support#12902
LuciferYang wants to merge 10 commits into
apache:mainfrom
LuciferYang:spark33-drop-p1-remove

Conversation

@LuciferYang

@LuciferYang LuciferYang commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

What changes are proposed in this pull request?

Removes the Spark 3.3 build surface. This covers three items in #12807: the Spark-33 unit tests, the Spark-33 shim source tree, and the building scripts. Two follow-ups remain, described at the end.

Seven directories go, 328 files and about 41k lines: shims/spark33, gluten-ut/spark33, backends-clickhouse/src-delta23, gluten-delta/src-delta23, backends-clickhouse/src-iceberg-spark33, gluten-iceberg/src-iceberg5, gluten-iceberg/src-iceberg3. The spark-3.3 profile is gone from the six poms that declared one, and the root pom's requireActiveProfile list now names only the four surviving versions, so -Pspark-3.3 fails with Missing spark version profile instead of quietly resolving to whatever the defaults are.

gluten-iceberg/src-iceberg3 needs a word since its name does not mention 3.3: no profile ever set iceberg.binary.version=3, so no build could reach it, and at the base commit its two files were byte-identical to src-iceberg5's. It was already dead, and src-iceberg5 was reachable only from the 3.3 profile, so both go together.

LICENSE carried twelve entries pointing into shims/spark33/ and src-delta23/. Those are removed, and the remaining 24 paths were checked to still resolve.

Four CI jobs ran only on Spark 3.3 and are the sole coverage for what they exercise, so they are retargeted to 3.5 rather than deleted: tpc-test-ubuntu-oom, tpc-test-ubuntu-randomkill, tpc-test-centos8-uniffle, tpc-test-ubuntu-2204-celeborn. For celeborn the gluten-it install command moved with it, and it now takes the profile from matrix.spark like the Gluten build two steps above it. spark-test-spark33 and spark-test-spark33-slow are deleted outright: 3.4 and 3.5 run the same profile set (-Piceberg -Pdelta -Phudi -Ppaimon), so no combination is orphaned. The shims33 change-detection flag and its path filter go with them.

The ClickHouse release chain hardcoded 3.3 end to end: ep/build-clickhouse/src/package.sh built only that version and bin/gluten.sh only recognised jars/spark33, so leaving it would have shipped a tarball whose launcher cannot find its own jars. Both move to 3.5, which also settles the # TODO: support spark 3.5 later sitting next to it. I have no ClickHouse environment, so that part rests on reading and bash -n. The ClickHouse CI triggers itself here (this PR touches pom.xml, backends-clickhouse/**, shims/** and more, which the trigger workflow's path filters match), but a CH maintainer's eyes on the packaging change would still help.

Four things reviewers should know.

install-spark-resources.sh no longer installs the 3.3 distribution, so docker_image.yml will rebuild the images and /opt/shims/spark33/spark_home disappears from them. Nothing in the repo references that path, but a branch that still does will break once the new image is published.

The ClickHouse CI is red on this PR for a reason that cannot be fixed from here. That job is a Jenkins build outside this repository (its workspace is .../gluten/gluten-ci/, and its parent pom is io.kyligence:devopslib), and it invokes mvn clean test -Pbackends-clickhouse -Pspark-3.3 -Pjava-8 ... -Dspark.test.home=/tmp/spark33. With the profile gone, enforce-spark-profile stops it before anything compiles: Missing spark version profile: -Pspark-<version>. Nothing in apache/gluten generates that command line, so whoever owns the job needs to move it to -Pspark-3.5 and a Spark 3.5 spark.test.home, which is the only version the ClickHouse backend has a profile for anyway. Worth noting that its reactor listing already shows Gluten Shims for Spark 3.5, so that environment appears to activate spark-3.5 from its own settings rather than from the command line. Because it fails at the first enforcer rule, that run says nothing yet about whether the ClickHouse changes in this PR are sound.

dev/release/build-release.sh had a "Java 8 is required" gate whose only purpose was the Spark 3.3 build directly below it. With that build gone nothing in the script needs Java 8 (the four remaining builds all pass -Pjava-17, and the script installs Corretto 17 a few lines later), while the gate still rejects a release manager on JDK 17, and it does so after the longest step in the script. The design note for this work listed it as out of scope; I removed it here instead, since this change is what made it vestigial. dev/release/package-release.sh needed the same treatment for a different reason: its SPARK_VERSIONS list still demanded a 3.3 bundle jar that can no longer be built, and it hard-fails on a missing jar before it packages anything, so a release cut would have produced zero artifacts.

Five test cases are pinned to 3.3 with testWithMaxSparkVersion / testWithSpecifiedSparkVersion, and those helpers skip the test() call entirely when no version matches, so from this PR until PR 3 they run nowhere and leave no skip marker: VeloxParquetWriteForHiveSuite's hive.exec.compress.output case, ClickhouseGlutenKafkaScanSuite's only case, and three in GlutenClickHouseNativeWriteTableSuite. Two carry TODOs saying they fail on 3.5, so each needs a decision (port or delete plus an issue) rather than a substitution, which is why they belong to PR 3.

Deliberately left alone: the nineteen ignoreClass entries in package/pom.xml under "The overridden class list by Gluten" are now inert, because all five classes they name were overridden only in shims/spark33, but banDuplicateClasses runs with fail=true and dropping the entries could surface a duplicate from a dependency jar, so that is its own call. tools/gluten-it/pom.xml is a standalone pom without requireActiveProfile, so -Pspark-3.3 there now warns and builds 3.5 rather than failing; adding the same gate would also outlaw the profile-less build that works today. And tools/workload/benchmark_velox/initialize.ipynb still provisions Spark 3.3.1 across five coupled lines including a symlink; I cannot test that notebook, so I left it rather than half-update it.

Follow-ups under #12807: PR 2 lifts the shim methods that existed only for 3.3, PR 3 removes the residual version checks (eqSpark33, AlignExpandOutputTypes, the NativeWritePostRule registration, the spark33 helper in the CH tests) and handles the five pinned cases above.

How was this patch tested?

Local verification, all against this branch:

check result
mvn validate -Pspark-3.3 fails with Missing spark version profile, as intended
test-compile for 3.4, 3.5, 4.0, 4.1 all pass
full-feature builds (-Pceleborn,uniffle -Piceberg,delta,hudi,paimon) pass
-Pbackends-clickhouse build passes, which is what shows src-delta does not reference anything that lived only in src-delta23
dev/format-scala-code.sh --check passes, no Missing spark version profile
docker buildx build --check on Dockerfile.ubuntu22-m2-cache one NoEmptyContinuation warning, byte-for-byte the same warning the pre-change file produces
bash -n on every changed script passes

One caveat on the local runs: the 3.5 builds needed -Pscala-2.13 to get around corrupted spark-*_2.12/3.5.5 jars in my local ~/.m2, and that combination has to skip -Ppaimon because upstream never published paimon-spark-3.5_2.13. The 2.12 path is what CI exercises.

The license header check needs a note, because I got it wrong at first. It inspects every file a PR changes, not only the files it adds, so removing the spark-3.3 profile from shims/pom.xml and the stale clean exclude from package/pom.xml put both under the check, and both carried the short Apache notice rather than the ASF header. They now carry the ASF header, matching gluten-ut/pom.xml and the root pom. I replaced the short block instead of stacking the ASF one above it, which is what check.py's own fix mode does and would have left two license blocks in each file. bash .github/workflows/util/check.sh <base> exits 0 locally after the change (it needs pip install regex).

Unit tests are what CI settles, not a local run. The ClickHouse packaging changes are the part I am least able to verify myself.

Was this patch authored or co-authored using generative AI tooling?

Generated-by: Claude claude-opus-5

Also removes spark-3.3 from the format script's profile list first, since every
later step runs it and the enforcer's requireActiveProfile would reject an
unknown profile once the poms no longer define it.
Removes shims/spark33, gluten-ut/spark33, and the delta 2.3 / iceberg 1.5 source
directories that only the spark-3.3 profile selected. Also drops
gluten-iceberg/src-iceberg3, which was already dead: iceberg.binary.version was
never set to 3 and the file was a byte-identical copy of the src-iceberg5 one.
LICENSE loses the 12 entries that pointed into the removed directories.
Drops the two spark-test-spark33 jobs and the shims33 change-detection flag they
were the only consumers of, removes 3.3 from the two TPC matrices, and moves the
four Spark-3.3-only jobs (OOM, random-kill, uniffle, celeborn) to 3.5 so those
scenarios keep their only coverage. Their step names said spark3.3 too.
…ing chain

The ClickHouse release chain hardcoded 3.3: package.sh built only that version
and gluten.sh only recognised jars/spark33, so it would have broken outright.
Moves both to 3.5 and settles the 'TODO: support spark 3.5 later' next to it.
Merges the two version-split sections in velox-backend-limitations.md, keeping
the 3.4+ behaviour that is now the floor.
Six places updated a version marker without the thing it governed: the m2-cache
Dockerfile's dangling continuation swallowed WORKDIR into the RUN, package-release.sh
still demanded a 3.3 bundle jar that can no longer be built, build-release.sh kept a
Java-8 gate with no Java-8 build left, ClickHouse.md paired Spark 3.5.5 with Delta
2.2.0, clickhouse-backend-debug.md kept spark.test.home at spark33, and the nightly
bundle jobs built 3.5 twice.
Copilot AI lite review requested due to automatic review settings August 26, 2026 14:16
@github-actions

Copy link
Copy Markdown

Run Gluten Clickhouse CI on x86

Copilot AI 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.

Copilot wasn't able to review this pull request because it exceeds the maximum number of files (300). Try reducing the number of changed files and requesting a review from Copilot again.


# Spark 4.0
$MVN_CMD -Pjava-17,scala-2.13,spark-4,backends-velox,hadoop-3.3,spark-ut \
$MVN_CMD -Pjava-17,scala-2.13,spark-4.0,backends-velox,hadoop-3.3,spark-ut \

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Drive-by fix, unrelated to Spark 3.3, flagged here because it sits in the same RUN as the continuation fix below.

spark-4 is not a profile id. The root pom defines spark-4.0 and spark-4.1, so Maven printed The requested profile "spark-4" could not be activated because it does not exist. and carried on with the root defaults. enforce-spark-profile does not catch it either: dependency:go-offline invokes the plugin goal directly rather than running a lifecycle, and that execution binds to validate, so it never fires. I confirmed the command exits 0 with only the warning.

Falling back to the defaults gives a mix that is mostly 3.5: sparkshim.artifactId resolves to spark-sql-columnar-shims-spark35, sparkbundle.version to 3.5, delta.version to 3.3.2. Only spark.version happens to match, since the root default is already 4.0.2, so the Spark 4.0 jars did land in the cache while the Delta 4.0.1 and spark40 shim coordinates did not. That is the whole cost: no red build, just a cache image that does not hold what this stanza was meant to pre-populate for the 4.0 jobs.

Introduced in #11655. Happy to pull it into its own PR if you would rather keep this one to the removal.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Split out to #12903 and reverted here, so this PR's only change to this file is the removal of the Spark 3.3 stanza plus the trailing ; \ that removal left dangling.

It is pre-existing (apache#11655) and adds behavior rather than removing it, so it
does not belong in a removal PR. Split into its own MINOR PR.
@github-actions

Copy link
Copy Markdown

Run Gluten Clickhouse CI on x86

Copilot AI 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.

Copilot wasn't able to review this pull request because it exceeds the maximum number of files (300). Try reducing the number of changed files and requesting a review from Copilot again.

Copilot AI review requested due to automatic review settings August 27, 2026 02:49
@github-actions

Copy link
Copy Markdown

Run Gluten Clickhouse CI on x86

Copilot AI 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.

Pull request overview

Copilot reviewed 161 out of 369 changed files in this pull request and generated 1 comment.

Comment on lines +39 to 41
# Run test to generate input data files. If you are using spark 3.4, replace -Pspark-3.5 with -Pspark-3.4.
mvn test -Pspark-3.5 -Pbackends-velox -pl backends-velox -am \
-DtagsToInclude="org.apache.gluten.tags.GenerateExample" -Dtest=none -DfailIfNoTests=false -Dexec.skip
Both carried the short Apache notice instead of the ASF header. dev/check.py
only inspects files a PR changes, so touching these two for the profile removal
is what surfaced it. Replaced the short block rather than stacking the ASF one
on top of it, which is what the checker's own fix does.
Copilot AI review requested due to automatic review settings August 27, 2026 02:55
@github-actions

Copy link
Copy Markdown

Run Gluten Clickhouse CI on x86

Copilot AI 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.

Pull request overview

Copilot reviewed 161 out of 369 changed files in this pull request and generated no new comments.

Suppressed comments (1)

Previously missed (1) — in code that hasn't changed since the last review.

ep/build-clickhouse/src/package.sh:41

  • This script calls Maven via the system mvn, which can pick up an unexpected Maven/JVM configuration and diverge from the repo’s pinned build wrapper. Use the repo wrapper (./build/mvn) here to make the packaging build reproducible and consistent with the rest of Gluten’s build tooling.

@LuciferYang

Copy link
Copy Markdown
Contributor Author

The ClickHouse CI failure here is not from this change's content. That Jenkins job invokes mvn clean test -Pbackends-clickhouse -Pspark-3.3 -Pjava-8 ... -Dspark.test.home=/tmp/spark33, and with the spark-3.3 profile removed it stops at enforce-spark-profile with Missing spark version profile before anything compiles. So that run says nothing yet about whether the ClickHouse changes in this PR are sound.

The command line lives in the job configuration rather than in this repository. I grepped for ut-stage-1, gluten-ci, and the -DwildcardSuites=org.apache.gluten plus -Dgluten.test.data.path combination, and there is no in-repo caller; the workspace path and the io.kyligence:devopslib parent pom in the warnings both point outside apache/gluten. It needs -Pspark-3.5 and a Spark 3.5 spark.test.home. backends-clickhouse/pom.xml declares only a spark-3.5 profile, so 3.5 is the only target that build can have.

One detail for whoever picks this up: the reactor in that log already lists Gluten Shims for Spark 3.5, while in this repository shims/pom.xml keeps spark35 inside the spark-3.5 profile and the only activeByDefault profile is scala-2.12. That environment therefore looks like it activates spark-3.5 from its own settings rather than from the command line, which may mean the -Pspark-3.3 flag and the /tmp/spark33 path are the only two things that need to change.

@jackylee-ch could you help find someone with access to update that job, or point me at where it is configured?

@jackylee-ch

Copy link
Copy Markdown
Contributor

@zzcclp PTAL. We are removing Spark 3.3 supported in Gluten, but there are still some ClickHouse Spark 3.3 CI exists. Can we remove them in Gluten ClickHouse CI?

@zzcclp

zzcclp commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

@zzcclp PTAL. We are removing Spark 3.3 supported in Gluten, but there are still some ClickHouse Spark 3.3 CI exists. Can we remove them in Gluten ClickHouse CI?

OK, I will remove them later

@zzcclp

zzcclp commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Run Gluten Clickhouse CI on x86

# Conflicts:
#	docs/developers/dev-container.md
Copilot AI review requested due to automatic review settings August 28, 2026 10:49
@github-actions

Copy link
Copy Markdown

Run Gluten Clickhouse CI on x86

Copilot AI 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.

Pull request overview

Copilot reviewed 161 out of 369 changed files in this pull request and generated no new comments.

Suppressed comments (1)

ep/build-clickhouse/src/package.sh:41

  • This script invokes Maven directly (e.g., mvn ... in get_project_version and build_gluten_by_spark_version). Repository guidance expects using the ./build/mvn wrapper to ensure the pinned Maven version and JVM flags are applied; using plain mvn can make packaging results non-reproducible across environments.

@LuciferYang

Copy link
Copy Markdown
Contributor Author

@jackylee-ch @zhouyuan @philo-he Could you please help review this PR? The failed GHA task is unrelated to the current PR, but I do not have permission to trigger it manually. Thanks

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants