在“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,但我不明白它在哪里尝试部署它。 任何人都有 想法在哪里寻找那个罐子。
答案 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配置的路径。