Spark Standalone:如何避免 sbt assembly 和 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 输出效果非常好。

但是编译很费时间,我觉得这样的方法在我的开发中迭代太慢了。

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

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

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

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

然而,例如,spark-submit 似乎很清楚这一点..

application-jar : Path to a bundled jar including your application and all dependencies

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

有任何关于使用 Scala、SBT 和其他库加速我的 Spark 开发的建议吗?

您不必将所有依赖库都放入 assembly/fat jar - 它们只应在 运行 时间内可供您的应用程序使用。这可以以不同的方式完成:

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

有关详细信息,请参阅 Spark documentation

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

P.S。如果你将 运行 你的代码放在 Databricks 上,那么你可以通过 UI 或 API 将库安装到集群中,尽管你可能仍然有需要将库放入程序集的情况 - 这由于依赖冲突,有时需要