我正在使用maven(使用shade插件)构建一个spark应用程序,并将其scp到数据节点,以便使用spark-submit --deploy-mode集群执行(因为从构建系统直接启动)使用--deploy-mode客户端不起作用,因为不受我控制的非对称网络)。
这是我的启动命令
火花提交 - 级测试 - 主纱 --deploy-mode cluster - 监督 --verbose jarName.jar HDFS:///somePath/Test.txt hdfs:///somePath/Test.out
对于Test $ 1,作业快速失败并出现ClassNotFoundException; java中从我的主类
创建的一个匿名类6/03/18 12:59:41 WARN scheduler.TaskSetManager:阶段失去任务0.0 0.0(TID 0,dataNode3):java.lang.ClassNotFoundException:Test $ 1
我已经多次提到这个错误(谷歌),大多数建议归结为调用conf.setJars(jarPaths)或类似的。
我真的不明白为什么当jarName.jar中缺少的类肯定(我已经检查过)时需要这样做,为什么在编译时指定它比在运行时使用它更好--jar作为spark-submit参数,在任何一种情况下,我应该为jar提供什么路径。我已经从构建系统上的target / jarName.jar将它复制到datanode上的主目录,但似乎spark-submit将它复制到某个地方的hdfs很难确定为硬编码在编译时或启动时的路径名。
最重要的是,为什么不能根据someJar.jar参数自动处理这个问题,如果没有,我应该怎么做才能修复它?
答案 0 :(得分:0)
Check the answer from here spark submit java.lang.ClassNotFoundException
spark-submit --class Test --master yarn --deploy-mode cluster --supervise --verbose jarName.jar hdfs:///somePath/Test.txt hdfs:///somePath/Test.out
Try to use, also you could check the absolute path in your project
--class com.myclass.Test
答案 1 :(得分:0)
当我尝试以“集群”模式运行它时,我的Scala Spark应用程序也遇到了相同的问题:
--master yarn --deploy-mode cluster
我在this页上找到了解决方案。基本上,我所缺少的(命令中也缺少)是“ --jars”参数,该参数使您可以将应用程序jar分发到集群中。
建议:要解决此类错误,您可以使用以下命令:
yarn logs --applicationId yourApplicationId
yourApplicationId 应该在纱线异常日志中。