[英]Why does Spark application fail with “ClassNotFoundException: Failed to find data source: jdbc” as uber-jar with sbt assembly?
[英]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 会获取所有这些依赖项及其所有依赖项有关更多详细信息,请参阅Spark 文档。
此外,不应将 Spark 本身的依赖项打包到程序集中 - 它们需要标记为已provided
PS 如果您将在 Databricks 上运行您的代码,那么您可以通过 UI 或 API 将库安装到集群中,尽管您可能仍然需要将库放入汇编中 - 由于依赖关系,有时需要这样做冲突
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.