project/CelebornBuild.scala (588 lines of code) (raw):
/*
* 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.
*/
import java.nio.file.Files
import java.nio.charset.StandardCharsets.UTF_8
import java.util.Locale
import scala.util.Properties
import sbtassembly.AssemblyPlugin.autoImport._
import sbtprotoc.ProtocPlugin.autoImport._
import sbt._
import sbt.Keys._
import Utils._
import CelebornCommonSettings._
// import sbt.Keys.streams
object CelebornCommonSettings {
// Scala versions
val SCALA_2_11_12 = "2.11.12"
val SCALA_2_12_10 = "2.12.10"
val SCALA_2_12_15 = "2.12.15"
val SCALA_2_12_17 = "2.12.17"
val scala213 = "2.13.5"
val ALL_SCALA_VERSIONS = Seq(SCALA_2_11_12, SCALA_2_12_10, SCALA_2_12_15, SCALA_2_12_17, scala213)
val DEFAULT_SCALA_VERSION = SCALA_2_12_15
val projectScalaVersion = defaultScalaVersion()
val zstdJniVersion = sparkClientProjects.map(_.zstdJniVersion).getOrElse("1.5.2-1")
val lz4JavaVersion = sparkClientProjects.map(_.lz4JavaVersion).getOrElse("1.8.0")
// Dependent library versions
val commonsCryptoVersion = "1.0.0"
val commonsIoVersion = "2.13.0"
val commonsLang3Version = "3.12.0"
val findbugsVersion = "1.3.9"
val guavaVersion = "14.0.1"
val hadoopVersion = "3.2.4"
val javaxServletVersion = "3.1.0"
val leveldbJniVersion = "1.8"
val log4j2Version = "2.17.2"
val metricsVersion = "3.2.6"
val scalatestMockitoVersion = "1.17.14"
val nettyVersion = "4.1.93.Final"
val ratisVersion = "2.5.1"
val roaringBitmapVersion = "0.9.32"
val slf4jVersion = "1.7.36"
val snakeyamlVersion = "1.33"
// Versions for proto
val protocVersion = "3.19.2"
val protoVersion = "3.19.2"
scalaVersion := projectScalaVersion
autoScalaLibrary := false
// crossScalaVersions must be set to Nil on the root project
crossScalaVersions := Nil
lazy val commonSettings = Seq(
organization := "org.apache.celeborn",
scalaVersion := projectScalaVersion,
crossScalaVersions := ALL_SCALA_VERSIONS,
fork := true,
scalacOptions ++= Seq("-target:jvm-1.8"),
javacOptions ++= Seq("-encoding", UTF_8.name(), "-source", "1.8"),
// -target cannot be passed as a parameter to javadoc. See https://github.com/sbt/sbt/issues/355
Compile / compile / javacOptions ++= Seq("-target", "1.8"),
// Make sure any tests in any project that uses Spark is configured for running well locally
Test / javaOptions ++= Seq(
"-Xmx4g",
"-XX:+IgnoreUnrecognizedVMOptions",
"--add-opens=java.base/java.lang=ALL-UNNAMED",
"--add-opens=java.base/java.lang.invoke=ALL-UNNAMED",
"--add-opens=java.base/java.lang.reflect=ALL-UNNAMED",
"--add-opens=java.base/java.io=ALL-UNNAMED",
"--add-opens=java.base/java.net=ALL-UNNAMED",
"--add-opens=java.base/java.nio=ALL-UNNAMED",
"--add-opens=java.base/java.util=ALL-UNNAMED",
"--add-opens=java.base/java.util.concurrent=ALL-UNNAMED",
"--add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED",
"--add-opens=java.base/jdk.internal.misc=ALL-UNNAMED",
"--add-opens=java.base/sun.nio.ch=ALL-UNNAMED",
"--add-opens=java.base/sun.nio.cs=ALL-UNNAMED",
"--add-opens=java.base/sun.security.action=ALL-UNNAMED",
"--add-opens=java.base/sun.util.calendar=ALL-UNNAMED",
"-Dio.netty.tryReflectionSetAccessible=true"
),
testOptions += Tests.Argument("-oF"),
Test / testOptions += Tests.Argument("-oDF"),
Test / testOptions += Tests.Argument(TestFrameworks.JUnit, "-v", "-a"),
// Don't execute in parallel since we can't have multiple Sparks in the same JVM
Test / parallelExecution := false,
scalacOptions ++= Seq(
"-P:genjavadoc:strictVisibility=true" // hide package private types and methods in javadoc
),
javaOptions += "-Xmx4g",
// Configurations to speed up tests and reduce memory footprint
Test / javaOptions ++= Seq(
"-Xmx4g"
),
Test / envVars += ("IS_TESTING", "1")
)
lazy val protoSettings = Seq(
// Setting version for the protobuf compiler
PB.protocVersion := protocVersion,
// set proto sources path
Compile / PB.protoSources := Seq(sourceDirectory.value / "main" / "proto"),
Compile / PB.targets := Seq(PB.gens.java -> (Compile / sourceManaged).value)
)
lazy val commonUnitTestDependencies = Seq(
"org.mockito" % "mockito-core" % "4.11.0" % "test",
"org.scalatest" %% "scalatest" % "3.2.16" % "test",
"junit" % "junit" % "4.13.2" % "test",
// https://www.scala-sbt.org/1.x/docs/Testing.html
"com.github.sbt" % "junit-interface" % "0.13.3" % "test")
}
object CelebornBuild extends sbt.internal.BuildDef {
override def projectDefinitions(baseDirectory: File): Seq[Project] = {
Seq(
CelebornCommon.common,
CelebornClient.client,
CelebornService.service,
CelebornWorker.worker,
CelebornMaster.master) ++ maybeSparkClientModules ++ maybeFlinkClientModules
}
// ThisBuild / parallelExecution := false
// scalaVersion := "2.11.12"
// autoScalaLibrary := false
crossScalaVersions := Nil
// load user-defined Profiles
// loadProfiles()
}
object Utils {
val profiles = {
val profiles = Properties.envOrNone("SBT_MAVEN_PROFILES")
.orElse(Properties.propOrNone("sbt.maven.profiles")) match {
case None => Seq("sbt")
case Some(v) =>
v.split("(\\s+|,)").filterNot(_.isEmpty).map(_.trim.replaceAll("-P", "")).toSeq
}
if (profiles.contains("jdwp-test-debug")) {
sys.props.put("test.jdwp.enabled", "true")
}
profiles
}
val SPARK_VERSION = profiles.filter(_.startsWith("spark")).headOption
lazy val sparkClientProjects = SPARK_VERSION match {
case Some("spark-2.4") => Some(Spark24)
case Some("spark-3.0") => Some(Spark30)
case Some("spark-3.1") => Some(Spark31)
case Some("spark-3.2") => Some(Spark32)
case Some("spark-3.3") => Some(Spark33)
case Some("spark-3.4") => Some(Spark34)
case _ => None
}
lazy val maybeSparkClientModules: Seq[Project] = sparkClientProjects.map(_.modules).getOrElse(Seq.empty)
val FLINK_VERSION = profiles.filter(_.startsWith("flink")).headOption
lazy val flinkClientProjects = FLINK_VERSION match {
case Some("flink-1.14") => Some(Flink114)
case Some("flink-1.15") => Some(Flink115)
case Some("flink-1.17") => Some(Flink117)
case _ => None
}
lazy val maybeFlinkClientModules: Seq[Project] = flinkClientProjects.map(_.modules).getOrElse(Seq.empty)
def defaultScalaVersion(): String = {
// 1. Inherit the scala version of the spark project
// 2. if the spark profile not specified, using the DEFAULT_SCALA_VERSION
val v = sparkClientProjects.map(_.sparkProjectScalaVersion).getOrElse(DEFAULT_SCALA_VERSION)
require(ALL_SCALA_VERSIONS.contains(v), s"found not allow scala version: $v")
v
}
}
object CelebornCommon {
lazy val common = Project("celeborn-common", file("common"))
.settings (
commonSettings,
protoSettings,
libraryDependencies ++= Seq(
"com.google.protobuf" % "protobuf-java" % protoVersion % "protobuf",
"com.google.code.findbugs" % "jsr305" % findbugsVersion,
"com.google.guava" % "guava" % guavaVersion,
"commons-io" % "commons-io" % commonsIoVersion,
"io.dropwizard.metrics" % "metrics-core" % metricsVersion,
"io.dropwizard.metrics" % "metrics-graphite" % metricsVersion,
"io.dropwizard.metrics" % "metrics-jvm" % metricsVersion,
"io.netty" % "netty-all" % nettyVersion,
"org.apache.commons" % "commons-crypto" % commonsCryptoVersion,
"org.apache.commons" % "commons-lang3" % commonsLang3Version,
"org.apache.hadoop" % "hadoop-client-api" % hadoopVersion,
"org.apache.hadoop" % "hadoop-client-runtime" % hadoopVersion,
"org.apache.ratis" % "ratis-client" % ratisVersion,
"org.apache.ratis" % "ratis-common" % ratisVersion,
"org.fusesource.leveldbjni" % "leveldbjni-all" % leveldbJniVersion,
"org.roaringbitmap" % "RoaringBitmap" % roaringBitmapVersion,
"org.scala-lang" % "scala-reflect" % scalaVersion.value,
"org.slf4j" % "jcl-over-slf4j" % slf4jVersion,
"org.slf4j" % "jul-to-slf4j" % slf4jVersion,
"org.slf4j" % "slf4j-api" % slf4jVersion,
"org.yaml" % "snakeyaml" % snakeyamlVersion,
"org.apache.logging.log4j" % "log4j-slf4j-impl" % log4j2Version % "test",
"org.apache.logging.log4j" % "log4j-1.2-api" % log4j2Version % "test",
// Compiler plugins
// -- Bump up the genjavadoc version explicitly to 0.18 to work with Scala 2.12
compilerPlugin(
"com.typesafe.genjavadoc" %% "genjavadoc-plugin" % "0.18" cross CrossVersion.full)
) ++ commonUnitTestDependencies,
Compile / sourceGenerators += Def.task {
val file = (Compile / sourceManaged).value / "org" / "apache" / "celeborn" / "package.scala"
streams.value.log.info(s"geneate version information file ${file.toPath}")
IO.write(file,
s"""package org.apache
|
|package object celeborn {
| val VERSION = "${version.value}"
|}
|""".stripMargin)
Seq(file)
// generate version task depends on PB generate to avoid concurrency generate source files
}.dependsOn(Compile / PB.generate),
// a task to show current profiles
printProfiles := {
val message = profiles.mkString("", " ", "")
println("compile with profiles: %s".format(message))
}
)
lazy val printProfiles = taskKey[Unit]("Prints Profiles")
}
object CelebornClient {
lazy val client = Project("celeborn-client", file("client"))
// ref: https://www.scala-sbt.org/1.x/docs/Multi-Project.html#Classpath+dependencies
.dependsOn(CelebornCommon.common % "test->test;compile->compile")
.settings (
commonSettings,
libraryDependencies ++= Seq(
"io.netty" % "netty-all" % nettyVersion,
"com.google.guava" % "guava" % guavaVersion,
"org.lz4" % "lz4-java" % lz4JavaVersion,
"com.github.luben" % "zstd-jni" % zstdJniVersion,
"org.apache.commons" % "commons-lang3" % commonsLang3Version,
"org.apache.logging.log4j" % "log4j-slf4j-impl" % log4j2Version % "test",
"org.apache.logging.log4j" % "log4j-1.2-api" % log4j2Version % "test",
// Compiler plugins
// -- Bump up the genjavadoc version explicitly to 0.18 to work with Scala 2.12
compilerPlugin(
"com.typesafe.genjavadoc" %% "genjavadoc-plugin" % "0.18" cross CrossVersion.full)
) ++ commonUnitTestDependencies
)
}
object CelebornService {
lazy val service = Project("celeborn-service", file("service"))
.dependsOn(CelebornCommon.common)
.settings (
commonSettings,
libraryDependencies ++= Seq(
"com.google.code.findbugs" % "jsr305" % findbugsVersion,
"commons-io" % "commons-io" % commonsIoVersion,
"io.netty" % "netty-all" % nettyVersion,
"javax.servlet" % "javax.servlet-api" % javaxServletVersion,
"org.apache.commons" % "commons-crypto" % commonsCryptoVersion,
"org.slf4j" % "slf4j-api" % slf4jVersion,
"org.apache.logging.log4j" % "log4j-slf4j-impl" % log4j2Version % "test",
"org.apache.logging.log4j" % "log4j-1.2-api" % log4j2Version % "test",
// Compiler plugins
// -- Bump up the genjavadoc version explicitly to 0.18 to work with Scala 2.12
compilerPlugin(
"com.typesafe.genjavadoc" %% "genjavadoc-plugin" % "0.18" cross CrossVersion.full)
) ++ commonUnitTestDependencies
)
}
object CelebornMaster {
lazy val master = Project("celeborn-master", file("master"))
.dependsOn(CelebornCommon.common, CelebornService.service)
.settings (
commonSettings,
protoSettings,
libraryDependencies ++= Seq(
"com.google.guava" % "guava" % guavaVersion,
"com.google.protobuf" % "protobuf-java" % protoVersion,
"io.netty" % "netty-all" % nettyVersion,
"org.apache.hadoop" % "hadoop-client-api" % hadoopVersion,
"org.apache.logging.log4j" % "log4j-1.2-api" % log4j2Version,
"org.apache.logging.log4j" % "log4j-slf4j-impl" % log4j2Version,
"org.apache.ratis" % "ratis-client" % ratisVersion,
"org.apache.ratis" % "ratis-common" % ratisVersion,
"org.apache.ratis" % "ratis-grpc" % ratisVersion,
"org.apache.ratis" % "ratis-netty" % ratisVersion,
"org.apache.ratis" % "ratis-server" % ratisVersion,
"org.apache.ratis" % "ratis-shell" % ratisVersion,
// Compiler plugins
// -- Bump up the genjavadoc version explicitly to 0.18 to work with Scala 2.12
compilerPlugin(
"com.typesafe.genjavadoc" %% "genjavadoc-plugin" % "0.18" cross CrossVersion.full)
) ++ commonUnitTestDependencies
)
}
object CelebornWorker {
lazy val worker = Project("celeborn-worker", file("worker"))
.dependsOn(CelebornCommon.common, CelebornService.service)
.dependsOn(CelebornClient.client % "test->test;compile->compile")
.dependsOn(CelebornMaster.master % "test->test;compile->compile")
.settings (
commonSettings,
libraryDependencies ++= Seq(
"com.google.guava" % "guava" % guavaVersion,
"commons-io" % "commons-io" % commonsIoVersion,
"io.netty" % "netty-all" % nettyVersion,
"org.apache.logging.log4j" % "log4j-1.2-api" % log4j2Version,
"org.apache.logging.log4j" % "log4j-slf4j-impl" % log4j2Version,
"org.fusesource.leveldbjni" % "leveldbjni-all" % leveldbJniVersion,
"org.roaringbitmap" % "RoaringBitmap" % roaringBitmapVersion,
"org.mockito" %% "mockito-scala-scalatest" % scalatestMockitoVersion % "test",
// Compiler plugins
// -- Bump up the genjavadoc version explicitly to 0.18 to work with Scala 2.12
compilerPlugin(
"com.typesafe.genjavadoc" %% "genjavadoc-plugin" % "0.18" cross CrossVersion.full)
) ++ commonUnitTestDependencies
)
}
////////////////////////////////////////////////////////
// Spark Client //
////////////////////////////////////////////////////////
object Spark24 extends SparkClientProjects {
val sparkClientProjectPath = "client-spark/spark-2"
val sparkClientProjectName = "celeborn-client-spark-2"
val sparkClientShadedProjectPath = "client-spark/spark-2-shaded"
val sparkClientShadedProjectName = "celeborn-client-spark-2-shaded"
// val jacksonVersion = "2.5.7"
// val jacksonDatabindVersion = "2.6.7.3"
val lz4JavaVersion = "1.4.0"
val sparkProjectScalaVersion = "2.11.12"
// scalaBinaryVersion
// val scalaBinaryVersion = "2.11"
val sparkVersion = "2.4.8"
val zstdJniVersion = "1.4.4-3"
}
object Spark30 extends SparkClientProjects {
val sparkClientProjectPath = "client-spark/spark-3"
val sparkClientProjectName = "celeborn-client-spark-3"
val sparkClientShadedProjectPath = "client-spark/spark-3-shaded"
val sparkClientShadedProjectName = "celeborn-client-spark-3-shaded"
val lz4JavaVersion = "1.7.1"
val sparkProjectScalaVersion = "2.12.10"
val sparkVersion = "3.0.3"
val zstdJniVersion = "1.4.4-3"
}
object Spark31 extends SparkClientProjects {
val sparkClientProjectPath = "client-spark/spark-3"
val sparkClientProjectName = "celeborn-client-spark-3"
val sparkClientShadedProjectPath = "client-spark/spark-3-shaded"
val sparkClientShadedProjectName = "celeborn-client-spark-3-shaded"
val lz4JavaVersion = "1.7.1"
val sparkProjectScalaVersion = "2.12.10"
val sparkVersion = "3.1.3"
val zstdJniVersion = "1.4.8-1"
}
object Spark32 extends SparkClientProjects {
val sparkClientProjectPath = "client-spark/spark-3"
val sparkClientProjectName = "celeborn-client-spark-3"
val sparkClientShadedProjectPath = "client-spark/spark-3-shaded"
val sparkClientShadedProjectName = "celeborn-client-spark-3-shaded"
val lz4JavaVersion = "1.7.1"
val sparkProjectScalaVersion = "2.12.15"
val sparkVersion = "3.2.4"
val zstdJniVersion = "1.5.0-4"
}
object Spark33 extends SparkClientProjects {
val sparkClientProjectPath = "client-spark/spark-3"
val sparkClientProjectName = "celeborn-client-spark-3"
val sparkClientShadedProjectPath = "client-spark/spark-3-shaded"
val sparkClientShadedProjectName = "celeborn-client-spark-3-shaded"
// val jacksonVersion = "2.13.4"
// val jacksonDatabindVersion = "2.13.4.2"
val lz4JavaVersion = "1.8.0"
val sparkProjectScalaVersion = "2.12.15"
// scalaBinaryVersion
// val scalaBinaryVersion = "2.12"
val sparkVersion = "3.3.2"
val zstdJniVersion = "1.5.2-1"
}
object Spark34 extends SparkClientProjects {
val sparkClientProjectPath = "client-spark/spark-3"
val sparkClientProjectName = "celeborn-client-spark-3"
val sparkClientShadedProjectPath = "client-spark/spark-3-shaded"
val sparkClientShadedProjectName = "celeborn-client-spark-3-shaded"
val lz4JavaVersion = "1.8.0"
val sparkProjectScalaVersion = "2.12.17"
val sparkVersion = "3.4.1"
val zstdJniVersion = "1.5.2-5"
lazy val deps = Seq(
// Spark Use `log4j-slf4j2-impl` instead of `log4j-slf4j-impl` in SPARK-40511
// to fix the error:
// ```
// java.lang.NoSuchMethodError: org.apache.logging.slf4j.Log4jLoggerFactory.<init>(Lorg/apache/logging/slf4j/Log4jMarkerFactory;)V
// ```
"org.apache.logging.log4j" % "log4j-slf4j2-impl" % "2.19.0" % "test"
)
override def sparkCommon: Project = {
super.sparkCommon
.settings(libraryDependencies ++= deps)
}
override def sparkClient: Project = {
super.sparkClient
.settings(libraryDependencies ++= deps)
}
override def sparkIt: Project = {
super.sparkIt
.settings(libraryDependencies ++= deps)
}
}
trait SparkClientProjects {
val sparkClientProjectPath: String
val sparkClientProjectName: String
val sparkClientShadedProjectPath: String
val sparkClientShadedProjectName: String
val lz4JavaVersion: String
val sparkProjectScalaVersion: String
val sparkVersion: String
val zstdJniVersion: String
def modules: Seq[Project] = Seq(sparkCommon, sparkClient, sparkIt, sparkGroup, sparkClientShade)
// for test only, don't use this group for any other projects
lazy val sparkGroup = (project withId "celeborn-spark-group")
.aggregate(sparkCommon, sparkClient, sparkIt)
def sparkCommon: Project = {
Project("celeborn-spark-common", file("client-spark/common"))
.dependsOn(CelebornCommon.common)
// ref: https://www.scala-sbt.org/1.x/docs/Multi-Project.html#Classpath+dependencies
.dependsOn(CelebornClient.client % "test->test;compile->compile")
.settings (
commonSettings,
libraryDependencies ++= Seq(
"org.apache.spark" %% "spark-core" % sparkVersion % "provided",
"org.apache.spark" %% "spark-sql" % sparkVersion % "provided",
"org.apache.spark" %% "spark-core" % sparkVersion % "test" classifier "tests",
// Compiler plugins
// -- Bump up the genjavadoc version explicitly to 0.18 to work with Scala 2.12
compilerPlugin(
"com.typesafe.genjavadoc" %% "genjavadoc-plugin" % "0.18" cross CrossVersion.full)
) ++ commonUnitTestDependencies
)
}
def sparkClient: Project = {
Project(sparkClientProjectName, file(sparkClientProjectPath))
.dependsOn(CelebornCommon.common, sparkCommon)
// ref: https://www.scala-sbt.org/1.x/docs/Multi-Project.html#Classpath+dependencies
.dependsOn(CelebornClient.client % "test->test;compile->compile")
.settings (
commonSettings,
libraryDependencies ++= Seq(
"org.apache.spark" %% "spark-core" % sparkVersion % "provided",
"org.apache.spark" %% "spark-sql" % sparkVersion % "provided",
// Compiler plugins
// -- Bump up the genjavadoc version explicitly to 0.18 to work with Scala 2.12
compilerPlugin(
"com.typesafe.genjavadoc" %% "genjavadoc-plugin" % "0.18" cross CrossVersion.full)
) ++ commonUnitTestDependencies
)
}
def sparkIt: Project = {
Project("celeborn-spark-it", file("tests/spark-it"))
// ref: https://www.scala-sbt.org/1.x/docs/Multi-Project.html#Classpath+dependencies
.dependsOn(CelebornCommon.common % "test->test;compile->compile")
.dependsOn(CelebornClient.client % "test->test;compile->compile")
.dependsOn(CelebornMaster.master % "test->test;compile->compile")
.dependsOn(CelebornWorker.worker % "test->test;compile->compile")
.dependsOn(sparkClient % "test->test;compile->compile")
.settings (
commonSettings,
libraryDependencies ++= Seq(
"org.apache.spark" %% "spark-core" % sparkVersion % "test",
"org.apache.spark" %% "spark-sql" % sparkVersion % "test",
"org.apache.spark" %% "spark-core" % sparkVersion % "test" classifier "tests",
"org.apache.spark" %% "spark-sql" % sparkVersion % "test" classifier "tests",
// Compiler plugins
// -- Bump up the genjavadoc version explicitly to 0.18 to work with Scala 2.12
compilerPlugin(
"com.typesafe.genjavadoc" %% "genjavadoc-plugin" % "0.18" cross CrossVersion.full)
) ++ commonUnitTestDependencies
)
}
def sparkClientShade: Project = {
Project(sparkClientShadedProjectName, file(sparkClientShadedProjectPath))
.dependsOn(sparkClient)
.settings (
commonSettings,
// align final shaded jar name with maven.
(assembly / assemblyJarName) := {
val extension = artifact.value.extension
s"${moduleName.value}_${scalaBinaryVersion.value}-${version.value}.$extension"
},
(assembly / test) := { },
(assembly / logLevel) := Level.Info,
// Exclude `scala-library` from assembly.
(assembly / assemblyPackageScala / assembleArtifact) := false,
(assembly / assemblyExcludedJars) := {
val cp = (assembly / fullClasspath).value
cp filter { v =>
val name = v.data.getName
!(name.startsWith("celeborn-") || name.startsWith("protobuf-java-") ||
name.startsWith("guava-") || name.startsWith("netty-") || name.startsWith("commons-lang3-"))
}
},
(assembly / assemblyShadeRules) := Seq(
ShadeRule.rename("com.google.protobuf.**" -> "org.apache.celeborn.shaded.com.google.protobuf.@1").inAll,
ShadeRule.rename("com.google.common.**" -> "org.apache.celeborn.shaded.com.google.common.@1").inAll,
ShadeRule.rename("io.netty.**" -> "org.apache.celeborn.shaded.io.netty.@1").inAll,
ShadeRule.rename("org.apache.commons.**" -> "org.apache.celeborn.shaded.org.apache.commons.@1").inAll
),
(assembly / assemblyMergeStrategy) := {
case m if m.toLowerCase(Locale.ROOT).endsWith("manifest.mf") => MergeStrategy.discard
// Drop all proto files that are not needed as artifacts of the build.
case m if m.toLowerCase(Locale.ROOT).endsWith(".proto") => MergeStrategy.discard
case m if m.toLowerCase(Locale.ROOT).startsWith("meta-inf/native-image") => MergeStrategy.discard
// Drop netty jnilib
case m if m.toLowerCase(Locale.ROOT).endsWith(".jnilib") => MergeStrategy.discard
// rename netty native lib
case "META-INF/native/libnetty_transport_native_epoll_x86_64.so" => CustomMergeStrategy.rename( _ => "META-INF/native/liborg_apache_celeborn_shaded_netty_transport_native_epoll_x86_64.so" )
case "META-INF/native/libnetty_transport_native_epoll_aarch_64.so" => CustomMergeStrategy.rename( _ => "META-INF/native/liborg_apache_celeborn_shaded_netty_transport_native_epoll_aarch_64.so" )
case _ => MergeStrategy.first
}
)
}
}
////////////////////////////////////////////////////////
// Flink Client //
////////////////////////////////////////////////////////
object Flink114 extends FlinkClientProjects {
val flinkVersion = "1.14.6"
// note that SBT does not allow using the period symbol (.) in project names.
val flinkClientProjectPath = "client-flink/flink-1.14"
val flinkClientProjectName = "celeborn-client-flink-1_14"
val flinkClientShadedProjectPath: String = "client-flink/flink-1.14-shaded"
val flinkClientShadedProjectName: String = "celeborn-client-flink-1_14-shaded"
override lazy val flinkStreamingDependency: ModuleID = "org.apache.flink" %% "flink-streaming-java" % flinkVersion % "test"
override lazy val flinkClientsDependency: ModuleID = "org.apache.flink" %% "flink-clients" % flinkVersion % "test"
override lazy val flinkRuntimeWebDependency: ModuleID = "org.apache.flink" %% "flink-runtime-web" % flinkVersion % "test"
}
object Flink115 extends FlinkClientProjects {
val flinkVersion = "1.15.4"
// note that SBT does not allow using the period symbol (.) in project names.
val flinkClientProjectPath = "client-flink/flink-1.15"
val flinkClientProjectName = "celeborn-client-flink-1_15"
val flinkClientShadedProjectPath: String = "client-flink/flink-1.15-shaded"
val flinkClientShadedProjectName: String = "celeborn-client-flink-1_15-shaded"
}
object Flink117 extends FlinkClientProjects {
val flinkVersion = "1.17.0"
// note that SBT does not allow using the period symbol (.) in project names.
val flinkClientProjectPath = "client-flink/flink-1.17"
val flinkClientProjectName = "celeborn-client-flink-1_17"
val flinkClientShadedProjectPath: String = "client-flink/flink-1.17-shaded"
val flinkClientShadedProjectName: String = "celeborn-client-flink-1_17-shaded"
}
trait FlinkClientProjects {
val flinkVersion: String
// note that SBT does not allow using the period symbol (.) in project names.
val flinkClientProjectPath: String
val flinkClientProjectName: String
val flinkClientShadedProjectPath: String
val flinkClientShadedProjectName: String
lazy val flinkStreamingDependency: ModuleID = "org.apache.flink" % "flink-streaming-java" % flinkVersion % "test"
lazy val flinkClientsDependency: ModuleID = "org.apache.flink" % "flink-clients" % flinkVersion % "test"
lazy val flinkRuntimeWebDependency: ModuleID = "org.apache.flink" % "flink-runtime-web" % flinkVersion % "test"
def modules: Seq[Project] = Seq(flinkCommon, flinkClient, flinkIt, flinkGroup, flinkClientShade)
// for test only, don't use this group for any other projects
lazy val flinkGroup = (project withId "celeborn-flink-group")
.aggregate(flinkCommon, flinkClient, flinkIt)
// get flink major version. e.g:
// 1.17.0 -> 1.17
// 1.15.4 -> 1.15
// 1.14.6 -> 1.14
lazy val flinkMajorVersion: String = flinkVersion.split("\\.").take(2).reduce(_ + "." + _)
// the output would be something like: celeborn-client-flink-1.17_2.12-0.4.0-SNAPSHOT.jar
def flinkClientJarName(
module: ModuleID,
artifact: Artifact,
scalaBinaryVersionString: String): String =
s"celeborn-client-flink-${flinkMajorVersion}_$scalaBinaryVersionString" + "-" + module.revision + "." + artifact.extension
// the output would be something like: celeborn-client-flink-1.17-shaded_2.12-0.4.0-SNAPSHOT.jar
def flinkClientShadeJarName(
revision: String,
artifact: Artifact,
scalaBinaryVersionString: String): String =
s"celeborn-client-flink-$flinkMajorVersion-shaded_$scalaBinaryVersionString" + "-" + revision + "." + artifact.extension
def flinkCommon: Project = {
Project("celeborn-flink-common", file("client-flink/common"))
.dependsOn(CelebornCommon.common, CelebornClient.client)
.settings (
commonSettings,
libraryDependencies ++= Seq(
"org.apache.flink" % "flink-runtime" % flinkVersion % "provided",
// Compiler plugins
// -- Bump up the genjavadoc version explicitly to 0.18 to work with Scala 2.12
compilerPlugin(
"com.typesafe.genjavadoc" %% "genjavadoc-plugin" % "0.18" cross CrossVersion.full)
) ++ commonUnitTestDependencies
)
}
def flinkClient: Project = {
Project(flinkClientProjectName, file(flinkClientProjectPath))
.dependsOn(CelebornCommon.common, CelebornClient.client, flinkCommon)
.settings (
commonSettings,
// 1. reference for modifying the jar name.
// https://stackoverflow.com/questions/52771831/how-to-modify-jar-name-generate-by-cmd-sbt-package
// 2. since SBT doesn't allow using `.` in the project name, explicitly setting the artifact Name
artifactName := { (sv: ScalaVersion, module: ModuleID, artifact: Artifact) =>
flinkClientJarName(module, artifact, scalaBinaryVersion.value)
},
libraryDependencies ++= Seq(
"org.apache.flink" % "flink-runtime" % flinkVersion % "provided",
"org.apache.logging.log4j" % "log4j-slf4j-impl" % log4j2Version % "test",
"org.apache.logging.log4j" % "log4j-1.2-api" % log4j2Version % "test",
// Compiler plugins
// -- Bump up the genjavadoc version explicitly to 0.18 to work with Scala 2.12
compilerPlugin(
"com.typesafe.genjavadoc" %% "genjavadoc-plugin" % "0.18" cross CrossVersion.full)
) ++ commonUnitTestDependencies
)
}
def flinkIt: Project = {
Project("celeborn-flink-it", file("tests/flink-it"))
// ref: https://www.scala-sbt.org/1.x/docs/Multi-Project.html#Classpath+dependencies
.dependsOn(CelebornCommon.common % "test->test;compile->compile")
.dependsOn(CelebornClient.client % "test->test;compile->compile")
.dependsOn(CelebornMaster.master % "test->test;compile->compile")
.dependsOn(CelebornWorker.worker % "test->test;compile->compile")
.dependsOn(flinkClient % "test->test;compile->compile")
.settings (
commonSettings,
libraryDependencies ++= Seq(
"org.apache.flink" % "flink-runtime" % flinkVersion % "test",
"org.apache.flink" %% "flink-scala" % flinkVersion % "test",
flinkStreamingDependency,
flinkClientsDependency,
flinkRuntimeWebDependency,
// Compiler plugins
// -- Bump up the genjavadoc version explicitly to 0.18 to work with Scala 2.12
compilerPlugin(
"com.typesafe.genjavadoc" %% "genjavadoc-plugin" % "0.18" cross CrossVersion.full)
) ++ commonUnitTestDependencies
)
}
def flinkClientShade: Project = {
Project(flinkClientShadedProjectName, file(flinkClientShadedProjectPath))
.dependsOn(flinkClient)
.settings (
commonSettings,
(assembly / test) := { },
(assembly / assemblyJarName) := {
val revision: String = version.value
val artifactValue: Artifact = artifact.value
flinkClientShadeJarName(revision, artifactValue, scalaBinaryVersion.value)
},
(assembly / logLevel) := Level.Info,
// Exclude `scala-library` from assembly.
(assembly / assemblyPackageScala / assembleArtifact) := false,
(assembly / assemblyExcludedJars) := {
val cp = (assembly / fullClasspath).value
cp filter { v =>
val name = v.data.getName
!(name.startsWith("celeborn-") ||
name.startsWith("protobuf-java-") ||
name.startsWith("guava-") ||
name.startsWith("netty-") ||
name.startsWith("commons-lang3-") ||
name.startsWith("RoaringBitmap-"))
}
},
(assembly / assemblyShadeRules) := Seq(
ShadeRule.rename("com.google.protobuf.**" -> "org.apache.celeborn.shaded.com.google.protobuf.@1").inAll,
ShadeRule.rename("com.google.common.**" -> "org.apache.celeborn.shaded.com.google.common.@1").inAll,
ShadeRule.rename("io.netty.**" -> "org.apache.celeborn.shaded.io.netty.@1").inAll,
ShadeRule.rename("org.apache.commons.**" -> "org.apache.celeborn.shaded.org.apache.commons.@1").inAll,
ShadeRule.rename("org.roaringbitmap.**" -> "org.apache.celeborn.shaded.org.roaringbitmap.@1").inAll
),
(assembly / assemblyMergeStrategy) := {
case m if m.toLowerCase(Locale.ROOT).endsWith("manifest.mf") => MergeStrategy.discard
// Drop all proto files that are not needed as artifacts of the build.
case m if m.toLowerCase(Locale.ROOT).endsWith(".proto") => MergeStrategy.discard
case m if m.toLowerCase(Locale.ROOT).startsWith("meta-inf/native-image") => MergeStrategy.discard
// Drop netty jnilib
case m if m.toLowerCase(Locale.ROOT).endsWith(".jnilib") => MergeStrategy.discard
// rename netty native lib
case "META-INF/native/libnetty_transport_native_epoll_x86_64.so" => CustomMergeStrategy.rename( _ => "META-INF/native/liborg_apache_celeborn_shaded_netty_transport_native_epoll_x86_64.so" )
case "META-INF/native/libnetty_transport_native_epoll_aarch_64.so" => CustomMergeStrategy.rename( _ => "META-INF/native/liborg_apache_celeborn_shaded_netty_transport_native_epoll_aarch_64.so" )
case _ => MergeStrategy.first
}
)
}
}