问题:
我正在尝试使用spark1.6.1和predictionio0.9.5来训练一个predictionio项目,但是在执行者开始工作之后,这个任务就立即失败了。这发生在一个独立的星团和一个Mesos星团中。在这两种情况下,我都是从远程客户机部署到集群的,即我正在运行 pio train -- --master [master on some other server]
.
症状:
在驱动程序日志中,在第一个 [Stage 0:> (0 + 0) / 2]
消息,遗嘱执行人死于 java.lang.NoClassDefFoundError: Could not initialize class org.apache.hadoop.hbase.protobuf.ProtobufUtil
调查:
发现问题类在 pio-assembly
jar:
jar -tf pio-assembly-0.9.5.jar | grep ProtobufUtil
org/apache/hadoop/hbase/protobuf/ProtobufUtil$1.class
org/apache/hadoop/hbase/protobuf/ProtobufUtil.class
提交时,这个jar与项目一起部署,可以在executors中找到
添加 --jars pio-assembly-0.9.5.jar
至 pio train
无法解决问题
使用创建uber jar pio build --clean --uber-jar
无法解决问题
设置 SPARK_CLASSPATH
关于奴隶的一个本地副本 pio-assembly-0.9.5.jar
解决问题了吗
据我所知, SPARK_CLASSPATH
已弃用,应替换为 --jars
提交时。我不想依赖一个不推荐的特性。我打电话时有什么遗漏吗 pio train
还是我的基础设施?执行器从驱动程序获取依赖项时是否存在缺陷(例如争用条件)?
1条答案
按热度按时间vxf3dgd41#
问题是
java.lang.NoClassDefFoundError: Could not initialize class
实际上并不意味着依赖不存在,而是它是一个名称不好的异常,真正的问题是类装入器在装入类时遇到了问题。实际问题将以java.lang.ExceptionInInitializerError
可能会从静态代码块中抛出。很难区分两者之间的区别java.lang.NoClassDefFoundError
以及java.lang.ClassNotFoundException
,但后者实际上意味着缺少依赖性(这个问题和其他问题提供了更多细节)。