火花加载在哪里?来自

时间:2017-07-03 13:49:50

标签: spring apache-spark

在“spark.jars”中指定jar时,在独立的spark上运行,没有spark-submit。罐装在哪里?

我有一个Spring应用程序,它在Docker中运行的Spark独立程序上执行一些spark操作。

我的应用程序依赖于各种库,例如MySQL JDBC,ElasticSearch等,因此它无法在没有它们的集群上运行。

我组装了我的jar及其所有依赖项,并将其移动到Docker中的/ jars目录。但仍然没有运气。

13:28:42.577 [Executor task launch worker-0] INFO org.apache.spark.executor.Executor - Fetching spark://192.168.99.1:58290/jars/xdf-1.0.jar with timestamp 1499088505128
13:28:42.614 [dispatcher-event-loop-0] INFO org.apache.spark.executor.Executor - Executor is trying to kill task 0.3 in stage 1.0 (TID 7)
13:28:42.698 [Executor task launch worker-0] DEBUG org.apache.spark.network.client.TransportClient - Sending stream request for /jars/xdf-1.0.jar to /192.168.99.1:58290
13:28:42.741 [shuffle-client-7-1] DEBUG org.apache.spark.rpc.netty.NettyRpcEnv - Error downloading stream /jars/xdf-1.0.jar.
java.lang.RuntimeException: Stream '/jars/xdf-1.0.jar' was not found.

现在我注意到它正在寻找驱动程序主机上的jar,但我不明白它在哪里尝试部署它。 任何人都有 想法在哪里寻找那个罐子。

2 个答案:

答案 0 :(得分:0)

我明白了。罐子从驱动程序节点加载。 所以,我不需要将我的罐子移动到火花节点。我必须设置依赖jar的正确路径。

所以这解决了它:

spark.jars=./target/scala-2.1.1/xdf.jar

答案 1 :(得分:-1)

如果你基本上运行一个在本地模式下运行的独立应用程序,你需要自己提供所有的jar,而不是为你提供spark-submit阶段的spark运行时间。假设您正在使用构建系统(如maven或gradle),则需要将所有传递依赖项打包到您的应用程序中,并删除任何范围提供的声明。

在这种情况下最简单的方法是使用程序集或maven-shade插件来打包胖罐,然后运行它。

如果您在群集模式下运行,则可以使用SparkLauncher以编程方式提交您的应用程序,这是scala中的一个示例:

import org.apache.spark.launcher.SparkLauncher

object Launcher extends App {
  val spark = new SparkLauncher()
    .setSparkHome("/home/user/spark-1.4.0-bin-hadoop2.6")
    .setAppResource("/home/user/example-assembly-1.0.jar")
    .setMainClass("MySparkApp")
    .setMaster("local[*]")
    .launch();
  spark.waitFor();
}

请记住,在纱线模式下,您还必须提供hadoop配置的路径。