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 将库安装到集群中,尽管你可能仍然有需要将库放入程序集的情况 - 这由于依赖冲突,有时需要
我有 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 将库安装到集群中,尽管你可能仍然有需要将库放入程序集的情况 - 这由于依赖冲突,有时需要