【问题标题】:Spark Standalone : how to avoid sbt assembly and uber-jar?Spark Standalone:如何避免 sbt 组装和 uber-jar?
【发布时间】:2021-03-24 11:28:24
【问题描述】:

我有 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 来生成一个 uber Jar,我可以将其用作 spark-submit 的参数,以便在我的 spark standalone 中运行这样的 spark 应用程序集群。

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

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

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

我知道我可以对build.sbt 进行一些优化以加快编译速度。但我认为它会保持缓慢。

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

理想情况下,我想一个方法,我只需要触发sbt package(比sbt assembly 快很多),然后我就可以在spark-submit 级别或spark standalone 集群级别判断,要加载哪些额外的 jar。

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

application-jar :包含您的应用程序和所有依赖项

的捆绑 jar 的路径

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

有什么可以加快我使用 Scala、SBT 和其他库的 Spark 开发速度的建议吗?

【问题讨论】:

    标签: scala apache-spark sbt databricks apache-spark-standalone


    【解决方案1】:

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

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

    更多详情请见Spark documentation

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

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

    【讨论】:

      猜你喜欢
      • 2019-07-16
      • 2015-04-12
      • 2019-05-06
      • 1970-01-01
      • 2016-11-13
      • 2014-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多