“提供”了哪些特定的 Spark 库?

djs*_*lla 4 hadoop apache-spark

在 Spark 官方文档中,解释了术语application jar对应于:

包含用户的 Spark 应用程序的 jar。在某些情况下,用户会想要创建一个包含其应用程序及其依赖项的“uber jar”。用户的 jar 不应包含 Hadoop 或 Spark 库,但是,这些库将在运行时添加

通过使用 maven 或 sbt 中的“Provided”范围可以轻松解决此问题:

"org.apache.spark" % "spark-core_2.10" % sparkVersion % Provided
Run Code Online (Sandbox Code Playgroud)

但是,我可能在这里遗漏了一些明显的东西,但我找不到直接的答案,在运行时将添加哪些特定库?仅仅是核心的(例如spark-core、hadoop-core)还是还会添加其他一些(例如:spark-streaming、hadoop-hdfs)?

有没有办法检查这一点并获取将在运行时添加的 Spark 依赖项的实际列表,因此可以将其标记为“已提供”?

Tza*_*har 5

简短的答案是:所有 Spark 库以及您从下载页面下载 Spark 时选择的 hadoop 版本。

更长的答案是:这取决于您使用的部署模式:

  1. 本地模式:由于本地模式下只有一个 JVM,即驱动程序应用程序的 JVM - 那么这取决于您打包驱动程序应用程序的方式。如果您没有(例如直接从 IDE 运行),则将依赖项定义为“已提供”并不意味着任何内容,因此 SBT 文件中的任何库都将在运行时出现。如果您打包驱动程序应用程序并尝试使用标记为提供的 Spark 来运行它,您可能会看到失败,除非您以其他方式将这些 jar 引入到混合中(但本地模式实际上并不是为此目的......) 。

  2. 独立模式:如果您将下载页面上提供的预构建包之一部署到集群(主计算机和工作计算机)上,则它们包含所有 Spark 库(包括 Spark SQL、Streaming、GraphX...)和 Hadoop 版本你选择了。如果您部署了自己构建的 jars - 好吧,那么这取决于您打包的内容和方式......

  3. Yarn 模式:当您向 YARN 管理器提交 Spark 应用程序时,您可以设置应用程序要使用的 Spark jar 位置(通过 参数spark.yarn.jar) - 无论该 jar (或多个 jar)包含什么,都将被加载。再说一次 - 如果该 jar 是预构建的 jar 之一,则它包含所有 Spark 库和所选的 Hadoop 版本