问题:
我正在尝试使用 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-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
或使用我的基础设施时有什么遗漏吗?执行程序从驱动程序获取依赖项是否存在缺陷(例如竞争条件)?