2017-07-03 53 views
0

在“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

如果您本质上正在运行以本地模式运行的独立应用程序,则需要自行提供所有jar,而不是使用spark-submit stage来为您启动spark run time。假设您使用的是像maven或gradle这样的构建系统,您将需要将所有传递依赖关系打包到您的应用程序中,并删除提供的任何作用域声明。

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

如果你在集群模式下运行,您可以通过编程提交使用SparkLauncher您的应用程序,这里是中阶的例子:

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配置。

+0

我一直在寻找明白的地方放置我的罐子:司机节点或主/从节点上。所以这不能回答我的问题。 – aclokay

0

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

因此,这解决了它:

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