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

时间:2017-06-30 16:25:25

标签: scala apache-spark sbt sbt-assembly

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

BlockMatrix.scala

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

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

来自

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

并使用新添加的项目类。

我的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
}

1 个答案:

答案 0 :(得分:1)

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

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

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

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

val sparkVersion = "2.1.0.cloudera1"

您也可以使用本地构建的Spark。重点是在一个超级jar中拥有所有依赖项,这些依赖项应该覆盖部署环境中的内容。