【发布时间】:2016-03-18 18:06:10
【问题描述】:
我正在使用 maven(带有 shade 插件)构建一个 spark 应用程序,并将其发送到数据节点以使用 spark-submit --deploy-mode 集群执行(因为使用 --deploy 直接从构建系统启动-mode 客户端不起作用,因为非对称网络不在我的控制之下)。
这是我的启动命令
火花提交 --class 测试 ——主纱 --deploy-mode 集群 - 监督 --详细 jarName.jar hdfs:///somePath/Test.txt hdfs:///somePath/Test.out
作业很快失败,Test$1 出现 ClassNotFoundException; java 从我的主类创建的匿名类之一
6/03/18 12:59:41 WARN scheduler.TaskSetManager: Lost task 0.0 in stage 0.0 (TID 0, dataNode3): java.lang.ClassNotFoundException: Test$1
我已经多次看到这个错误(谷歌),大多数建议归结为调用 conf.setJars(jarPaths) 或类似的。
当缺少的类在 jarName.jar 中肯定(我已经检查过)可用时,我真的不明白为什么需要这样做,为什么在编译时指定它比在运行时使用 --jar 更可取spark-submit 参数,在任何一种情况下,我应该为 jar 提供什么路径。我一直在将它从构建系统上的 target/jarName.jar 复制到我的数据节点上的主目录,但似乎 spark-submit 将它复制到 hdfs 的某个地方,这在任何一个编译时都很难确定为硬编码的路径名或启动时间。
最重要的是,为什么 spark-submit 不根据 someJar.jar 参数自动处理这个问题,如果没有,我应该怎么做才能解决它?
【问题讨论】:
-
刚刚尝试在云雀上使用 --deployMode 客户端,它成功了!我真的不明白这个。
-
我相信 Spark 找不到你的 jar。您的 jar 是否存在于每个节点中?您是否尝试指定 jar 的绝对路径?
标签: apache-spark classnotfoundexception