【问题标题】:Spark and Prediction IO: NoClassDefFoundError Despite Dependency ExistingSpark 和预测 IO:NoClassDefFoundError 尽管存在依赖关系
【发布时间】:2016-05-11 17:26:54
【问题描述】:

问题:

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

    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 并不能解决问题
  • 使用 pio build --clean --uber-jar 创建 uber jar 并不能解决问题
  • 将从属服务器上的SPARK_CLASSPATH 设置为pio-assembly-0.9.5.jar 的本地副本确实解决了问题

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

【问题讨论】:

    标签: scala apache-spark jar mesos predictionio


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2022-01-24
      • 1970-01-01
      • 2022-06-10
      • 1970-01-01
      • 2021-11-23
      • 1970-01-01
      • 2018-02-24
      • 1970-01-01
      • 2019-12-24
      相关资源
      最近更新 更多