3

问题:

我正在尝试使用 Spark 1.6.1 和 PredictionIO 0.9.5 训练一个 Prediction IO 项目,但是在 Executors 开始工作后该作业立即失败。这发生在独立 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-assemblyjar 中找到有问题的类:

    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.jarpio train并不能解决问题
  • 创建一个 uber jarpio build --clean --uber-jar并不能解决问题
  • SPARK_CLASSPATH奴隶设置为本地副本pio-assembly-0.9.5.jar 确实可以解决问题

据我所知,已弃用,提交SPARK_CLASSPATH时应替换为。--jars我宁愿不依赖于已弃用的功能。打电话pio train或使用我的基础设施时有什么遗漏吗?执行程序从驱动程序获取依赖项是否存在缺陷(例如竞争条件)?

4

1 回答 1

1

问题是这java.lang.NoClassDefFoundError: Could not initialize class实际上并不意味着依赖项不存在,而是它是一个名称不佳的异常,真正的问题是类加载器在加载类时遇到了麻烦。java.lang.ExceptionInInitializerError实际问题将以可能从静态代码块抛出的形式报告。很难分辨 和 之间的区别java.lang.NoClassDefFoundErrorjava.lang.ClassNotFoundException但后者实际上意味着缺少依赖项(这个问题和其他问题提供了更多细节)。

于 2016-05-13T01:08:35.770 回答