如何使用与 Cloudera 的 CDH 集群中使用的不同的 Spark 版本?

How to use different Spark version than as used in Cloudera's CDH cluster?

我使用安装了 Apache Spark 2.1.0.cloudera1 的 Cloudera 集群,但我需要来自 Apache Spark git 存储库的最新提交的新 class:

BlockMatrix.scala

我只是将整个文件复制粘贴到我的 sbt scala 项目,但我不知道如何创建 sbt-assembly MergeStrategy 来排除提供的集群 class:

org.apache.spark.mllib.linalg.distributed.BlockMatrix

来自

org.apache.spark/spark-mllib_2.11/jars/spark-mllib_2.11-2.1.0.cloudera1.jar 

并使用新添加的项目class。

我的 sbt.build 文件:

val sparkVersion = "2.1.0.cloudera1"

lazy val providedDependencies = Seq(
  "org.apache.spark" %% "spark-core" % sparkVersion,
  "org.apache.spark" %% "spark-sql" % sparkVersion,
  "org.apache.spark" %% "spark-mllib" % sparkVersion
)

libraryDependencies ++= providedDependencies.map(_ % "provided")

assemblyMergeStrategy in assembly := {
  case PathList("META-INF", "MANIFEST.MF") => MergeStrategy.discard
  case PathList("org", "apache", "spark", "unused", "UnusedStubClass.class") => MergeStrategy.first
  case _ => MergeStrategy.first
}

如果您想使用与您环境中使用的版本不对应的 Spark,只需 sbt assembly 单个 uber jar 中的所有 Spark 依赖项和 spark-submit 它。

安装 sbt-assembly 并删除标记 Spark 依赖项的行 provided (这表示将它们从 assembly 中排除,这与我们的目标完全相反)。

libraryDependencies ++= providedDependencies.map(_ % "provided")

您必须使用正确版本的 Spark,即也应更改以下行(以反映有问题的 BlockMatrix.scala 版本)。

val sparkVersion = "2.1.0.cloudera1"

您可能也想为此使用本地构建的 Spark。重点是将所有依赖项都放在一个 uber-jar 中,这些依赖项应该覆盖部署环境中的内容。