@@ -61,7 +61,18 @@ COPY --chown=${STACKABLE_USER_UID}:0 spark-k8s/hbase-connectors/stackable/patche
6161COPY  --chown=${STACKABLE_USER_UID}:0 spark-k8s/hbase-connectors/stackable/patches/${HBASE_CONNECTOR_VERSION} /stackable/src/spark-k8s/hbase-connectors/stackable/patches/${HBASE_CONNECTOR_VERSION}
6262
6363RUN  <<EOF
64- cd "$(/stackable/patchable --images-repo-root=src checkout spark-k8s/hbase-connectors ${HBASE_CONNECTOR_VERSION})/spark" 
64+ 
65+ #  IMPORTANT: HBase connectors don't support Spark 4 yet, so we skip the build.
66+ #  Watch this PR for updates: https://github.com/apache/hbase-connectors/pull/130
67+ if [[ "${PRODUCT_VERSION}"  == 4* ]]; then
68+     #  Create this empty directory so that following COPY layers succeed.
69+     mkdir -p /stackable/spark/jars
70+     #  Create a dummy tarball to satisfy the build process for Spark 3.
71+     touch hbase-connector-${HBASE_CONNECTOR}-stackable${RELEASE}-src.tar.gz
72+     exit 0
73+ fi
74+ 
75+ cd "$(/stackable/patchable --images-repo-root=src checkout spark-k8s/hbase-connectors ${HBASE_CONNECTOR})/spark" 
6576
6677NEW_VERSION="${HBASE_CONNECTOR_VERSION}-stackable${RELEASE_VERSION}" 
6778
@@ -80,18 +91,10 @@ export JDK_JAVA_OPTIONS="\
8091    --add-opens java.base/java.util=ALL-UNNAMED" 
8192
8293#  Get the Scala version used by Spark
83- SCALA_VERSION=$( \
84-     mvn --quiet --non-recursive --file /stackable/spark/pom.xml \
85-     org.apache.maven.plugins:maven-help-plugin:3.5.0:evaluate \
86-     -DforceStdout \
87-     -Dexpression='project.properties(scala.version)' )
94+ SCALA_VERSION=$(grep "scala.version"  /stackable/spark/pom.xml | head -n1 | awk -F '[<>]'  '{print $3}' )
8895
8996#  Get the Scala binary version used by Spark
90- SCALA_BINARY_VERSION=$( \
91-     mvn --quiet --non-recursive --file /stackable/spark/pom.xml \
92-     org.apache.maven.plugins:maven-help-plugin:3.5.0:evaluate \
93-     -DforceStdout \
94-     -Dexpression='project.properties(scala.binary.version)' )
97+ SCALA_BINARY_VERSION=$(grep "scala.binary.version"  /stackable/spark/pom.xml | head -n1 | awk -F '[<>]'  '{print $3}' )
9598
9699#  Build the Spark HBase connector
97100#  Skip the tests because the MiniHBaseCluster does not get ready for
@@ -110,6 +113,7 @@ mvn \
110113    --define hadoop-three.version="${HADOOP_VERSION}"  \
111114    --define hbase.version="${HBASE_VERSION}"  \
112115    --define skipTests \
116+     --define maven.test.skip=true \
113117    clean package
114118
115119mkdir -p /stackable/spark/jars
@@ -159,22 +163,36 @@ COPY --chown=${STACKABLE_USER_UID}:0 --from=spark-source-builder \
159163COPY  --from=hadoop-builder --chown=${STACKABLE_USER_UID}:0 /stackable/patched-libs /stackable/patched-libs
160164
161165#  >>> Build spark
162- #  Compiling the tests takes a lot of time, so we skip them
163- #  -Dmaven.test.skip=true skips both the compilation and execution of tests
164- #  -DskipTests skips only the execution
165166RUN  <<EOF
166167    #  Make Maven aware of custom Stackable libraries
167168    mv /stackable/patched-libs/maven /root/.m2/repository
168169
169170    ORIGINAL_VERSION="${PRODUCT_VERSION}" 
170171    NEW_VERSION="${PRODUCT_VERSION}-stackable${RELEASE_VERSION}" 
171172
173+     MAVEN_BIN="/usr/bin/mvn" 
172174    export MAVEN_OPTS="-Xss64m -Xmx2g -XX:ReservedCodeCacheSize=1g" 
173175
174-     ./dev/make-distribution.sh \
175-     -Dhadoop.version="${HADOOP_VERSION}-stackable${RELEASE_VERSION}"  \
176-     -DskipTests \
177-     -P'hadoop-3'  -Pkubernetes -Phive -Phive-thriftserver
176+     case "${PRODUCT_VERSION}"  in
177+         4*)
178+             #  The Spark 4 script has a --connect option which is not available in Spark 3.
179+             #  This option is required to build Spark Connect.
180+             #  Also this option breaks the Spark 3 build so we ensure it's only provided here.
181+             ./dev/make-distribution.sh \
182+             --mvn "${MAVEN_BIN}"  \
183+             --connect \
184+             -Dhadoop.version="${HADOOP_VERSION}-stackable${RELEASE_VERSION}"  \
185+             -DskipTests \
186+             -P'hadoop-3'  -Pkubernetes -Phive -Phive-thriftserver
187+             ;;
188+         *)
189+             ./dev/make-distribution.sh \
190+             --mvn "${MAVEN_BIN}"  \
191+             -Dhadoop.version="${HADOOP_VERSION}-stackable${RELEASE_VERSION}"  \
192+             -DskipTests \
193+             -P'hadoop-3'  -Pkubernetes -Phive -Phive-thriftserver
194+             ;;
195+     esac
178196
179197    sed -i "s/${NEW_VERSION}/${ORIGINAL_VERSION}/g"  assembly/target/bom.json
180198EOF
@@ -185,22 +203,30 @@ EOF
185203#  we create a new dist/connect folder, and copy them here.
186204RUN  <<EOF
187205
188-     #  Get the Scala binary version
189-     SCALA_BINARY_VERSION=$( \
190-         mvn --quiet --non-recursive --file pom.xml \
191-         org.apache.maven.plugins:maven-help-plugin:3.5.0:evaluate \
192-         -DforceStdout \
193-         -Dexpression='project.properties(scala.binary.version)' )
206+     SCALA_BINARY_VERSION=$(grep "scala.binary.version"  pom.xml | head -n1 | awk -F '[<>]'  '{print $3}' )
194207
195208    mkdir -p dist/connect
196209    cd dist/connect
197210
198-     cp "/stackable/spark-${PRODUCT_VERSION}-stackable${RELEASE_VERSION}/connector/connect/server/target/spark-connect_${SCALA_BINARY_VERSION}-${PRODUCT_VERSION}-stackable${RELEASE_VERSION}.jar"  .
199-     cp "/stackable/spark-${PRODUCT_VERSION}-stackable${RELEASE_VERSION}/connector/connect/common/target/spark-connect-common_${SCALA_BINARY_VERSION}-${PRODUCT_VERSION}-stackable${RELEASE_VERSION}.jar"  .
200-     cp "/stackable/spark-${PRODUCT_VERSION}-stackable${RELEASE_VERSION}/connector/connect/client/jvm/target/spark-connect-client-jvm_${SCALA_BINARY_VERSION}-${PRODUCT_VERSION}-stackable${RELEASE_VERSION}.jar"  .
201- 
202-     #  The Spark operator expects a file named spark-connect_${SCALA_BINARY_VERSION}-${PRODUCT_VERSION}.jar without the -stackable${RELEASE_VERSION} suffix.
211+     case "${PRODUCT_VERSION}"  in
212+         4*)
213+             cp "/stackable/spark-${PRODUCT_VERSION}-stackable${RELEASE_VERSION}/sql/connect/server/target/spark-connect_${SCALA_BINARY_VERSION}-${PRODUCT_VERSION}-stackable${RELEASE_VERSION}.jar"  .
214+             cp "/stackable/spark-${PRODUCT_VERSION}-stackable${RELEASE_VERSION}/sql/connect/common/target/spark-connect-common_${SCALA_BINARY_VERSION}-${PRODUCT_VERSION}-stackable${RELEASE_VERSION}.jar"  .
215+             cp "/stackable/spark-${PRODUCT_VERSION}-stackable${RELEASE_VERSION}/sql/connect/client/jvm/target/spark-connect-client-jvm_${SCALA_BINARY_VERSION}-${PRODUCT_VERSION}-stackable${RELEASE_VERSION}.jar"  .
216+             ;;
217+         *)
218+             cp "/stackable/spark-${PRODUCT_VERSION}-stackable${RELEASE_VERSION}/connector/connect/server/target/spark-connect_${SCALA_BINARY_VERSION}-${PRODUCT_VERSION}-stackable${RELEASE_VERSION}.jar"  .
219+             cp "/stackable/spark-${PRODUCT_VERSION}-stackable${RELEASE_VERSION}/connector/connect/common/target/spark-connect-common_${SCALA_BINARY_VERSION}-${PRODUCT_VERSION}-stackable${RELEASE_VERSION}.jar"  .
220+             cp "/stackable/spark-${PRODUCT_VERSION}-stackable${RELEASE_VERSION}/connector/connect/client/jvm/target/spark-connect-client-jvm_${SCALA_BINARY_VERSION}-${PRODUCT_VERSION}-stackable${RELEASE_VERSION}.jar"  .
221+             ;;
222+     esac
223+ 
224+     #  This link is needed by the operator and is kept for backwards compatibility.
225+     #  TODO: remove it at some time in the future.
203226    ln -s "spark-connect_${SCALA_BINARY_VERSION}-${PRODUCT_VERSION}-stackable${RELEASE_VERSION}.jar"  "spark-connect_${SCALA_BINARY_VERSION}-${PRODUCT_VERSION}.jar" 
227+     #  Link to the spark-connect jar without the stackable suffix and scala version.
228+     #  This link supersedes the previous link.
229+     ln -s "spark-connect_${SCALA_BINARY_VERSION}-${PRODUCT_VERSION}-stackable${RELEASE_VERSION}.jar"  "spark-connect-${PRODUCT_VERSION}.jar" 
204230EOF
205231
206232#  <<< Build spark
0 commit comments