繁体   English   中英

Spark Standalone:如何避免 sbt 组件和 uber-jar?

[英]Spark Standalone : how to avoid sbt assembly and uber-jar?

我有这样的sbt.build来进行 Spark 编程:

libraryDependencies ++= Seq(
  "org.apache.spark" %% "spark-core" % "3.0.1" withSources(),
  "com.datastax.spark" %% "spark-cassandra-connector" % "3.0.0" withSources()
  ...
)

由于我的程序使用 Spark 本身以外的其他库,因此我必须使用sbt assembly来生成一个超级 Jar,我可以将其用作spark-submit的参数,以便在我的spark standalone集群中运行这样的 spark 应用程序。

生成的uber-jar output 就像一个魅力。

但是编译花费了很多时间,而且我发现这种方法太慢了,无法在我的开发中进行迭代。

我的意思是,在每次我想要测试的 Spark 应用程序代码更改时,我都必须运行另一个编译 output 和 sbt 的uber-jar ,并且每次都需要很长时间(至少 5 分钟)才能完成,之前我可以在我的集群上运行它。

我知道我可以稍微优化一下build.sbt以加快编译速度。 但我认为它会保持缓慢。

所以,我的问题是,如果您知道还有其他方法可以完全避免构建uber-jar吗?

Ideally I think about a method, that I just have to trigger sbt package (lot faster than sbt assembly ), and where I then just can tell at the spark-submit level or at the spark standalone cluster level, which additionnal jars to load.

但是,例如, spark-submit似乎对此很清楚..

application-jar:捆绑 jar 的路径,包括您的应用程序和所有依赖

..所以可能我别无选择..

有任何指针可以使用 Scala、SBT 和其他库来加快我的 Spark 开发速度吗?

没有必要将所有依赖库放入程序集/胖 jar - 它们应该在运行时对您的应用程序可用。 这可以以不同的方式完成:

  • 通过--jars指定单个 jars - 这可能很麻烦,特别是如果 jars 本身有很多依赖项
  • 通过--packages指定 maven 坐标 - 在这种情况下,您只需提供依赖项(-ies),Spark 会获取所有这些依赖项及其所有依赖项
  • 将所有 jars 复制到集群的每个节点,因此它们将被自动拾取。

有关更多详细信息,请参阅Spark 文档

此外,不应将 Spark 本身的依赖项打包到程序集中 - 它们需要标记为已provided

PS 如果您将在 Databricks 上运行您的代码,那么您可以通过 UI 或 API 将库安装到集群中,尽管您可能仍然需要将库放入汇编中 - 由于依赖关系,有时需要这样做冲突

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM