Spark 和预测 IO:NoClassDefFoundError 尽管存在依赖关系
Spark and Prediction IO: NoClassDefFoundError Despite Dependency Existing
问题:
我正在尝试使用 Spark 1.6.1 和 PredictionIO 0.9.5 训练一个 Prediction IO 项目,但是在 Executors 开始工作后作业立即失败。这在 Stand-Alone Spark 集群和 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 中找到了 class-in-question:
jar -tf pio-assembly-0.9.5.jar | grep ProtobufUtil
org/apache/hadoop/hbase/protobuf/ProtobufUtil.class
org/apache/hadoop/hbase/protobuf/ProtobufUtil.class
- 提交的时候,这个jar是和项目一起部署的,可以在executors中找到
- 将
--jars pio-assembly-0.9.5.jar
添加到 pio train
并不能解决问题
- 使用
pio build --clean --uber-jar
创建一个 uber jar 并不能解决问题
- 在从站上将
SPARK_CLASSPATH
设置为 pio-assembly-0.9.5.jar
的本地副本 确实 解决了问题
据我所知,SPARK_CLASSPATH
已弃用,提交时应替换为 --jars
。我宁愿不依赖于已弃用的功能。调用 pio train
或使用我的基础架构时,我是否遗漏了什么?执行程序从驱动程序获取依赖项是否存在缺陷(例如竞争条件)?
问题是 java.lang.NoClassDefFoundError: Could not initialize class
实际上并不意味着依赖项不存在,而是一个命名不当的异常,真正的问题是 class 加载器加载有问题class。实际问题将以 java.lang.ExceptionInInitializerError
的形式报告,这很可能是从静态代码块中抛出的。很难说出 java.lang.NoClassDefFoundError
和 java.lang.ClassNotFoundException
之间的区别,但后者实际上意味着缺少依赖项( 和其他人提供了更多详细信息)。
问题:
我正在尝试使用 Spark 1.6.1 和 PredictionIO 0.9.5 训练一个 Prediction IO 项目,但是在 Executors 开始工作后作业立即失败。这在 Stand-Alone Spark 集群和 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 中找到了 class-in-question:jar -tf pio-assembly-0.9.5.jar | grep ProtobufUtil org/apache/hadoop/hbase/protobuf/ProtobufUtil.class org/apache/hadoop/hbase/protobuf/ProtobufUtil.class
- 提交的时候,这个jar是和项目一起部署的,可以在executors中找到
- 将
--jars pio-assembly-0.9.5.jar
添加到pio train
并不能解决问题 - 使用
pio build --clean --uber-jar
创建一个 uber jar 并不能解决问题 - 在从站上将
SPARK_CLASSPATH
设置为pio-assembly-0.9.5.jar
的本地副本 确实 解决了问题
据我所知,SPARK_CLASSPATH
已弃用,提交时应替换为 --jars
。我宁愿不依赖于已弃用的功能。调用 pio train
或使用我的基础架构时,我是否遗漏了什么?执行程序从驱动程序获取依赖项是否存在缺陷(例如竞争条件)?
问题是 java.lang.NoClassDefFoundError: Could not initialize class
实际上并不意味着依赖项不存在,而是一个命名不当的异常,真正的问题是 class 加载器加载有问题class。实际问题将以 java.lang.ExceptionInInitializerError
的形式报告,这很可能是从静态代码块中抛出的。很难说出 java.lang.NoClassDefFoundError
和 java.lang.ClassNotFoundException
之间的区别,但后者实际上意味着缺少依赖项(