首页 文章

Spark ML-无法使用MatrixFactorizationModel加载模型

提问于
浏览
1

我正在尝试使用Spark协同过滤实现推荐系统 .

首先,我准备模型并保存到磁盘:

MatrixFactorizationModel model = trainModel(inputDataRdd);  
model.save(jsc.sc(), "/op/tc/model/");

当我使用单独的进程加载模型时,程序失败并出现以下异常:
Code:

static JavaSparkContext jsc ;
    private static Options options;
    static{
        SparkConf conf = new SparkConf().setAppName("TC recommender application");
        conf.set("spark.driver.allowMultipleContexts", "true");
        jsc= new JavaSparkContext(conf);
     }
MatrixFactorizationModel model = MatrixFactorizationModel.load(jsc.sc(),
                "/op/tc/model/");

Exception:

线程“main”java.io.IOException中的异常:org.apache中的org.apache.hadoop.mapred.FileInputFormat.getSplits(FileInputFormat.java:324)中的文件:maprfs:/ op / tc / model / data不是.gark.rdd.HadoopRDD.getPartitions(HadoopRDD.scala:199)atg.apache.spark.rdd.RDD $$ anonfun $ partitions $ 2.apply(RDD.scala:239)at org.apache.spark.rdd.RDD $$ anonfun $在org.apache.spark.rdd.RDD.partitions(RDD.scala:237)的scala.Option.getOrElse(Option.scala:120)处分区$ 2.apply(RDD.scala:237) . aplet.spark.rdd.MapPartitionsRDD.getPartitions(MapPartitionsRDD.scala:35)atg.apache.spark.rdd.RDD $$ anonfun $ partitions $ 2.apply(RDD.scala:239)atg.apache.spark.rdd . RDD $$ anonfun $在org.apache.spark.rdd.RDD.partitions(RDD.scala:237)的scla.Option.getOrElse(Option.scala:120)处分区$ 2.apply(RDD.scala:237) .apache.spark.rdd.MapPartitionsRDD.getPartitions(MapPartitionsRDD.scala:35)atg.apache.spark.rdd.RDD $$ anonfun $ partitions $ 2.apply(RDD.scala:239)org.apache.spark.rdd .RDD $$ anonfun $分区$ 2 .apply(RDD.scala:237)位于org.apache.spark.rdd的org.apache.spark.rdd.RDD.partitions(RDD.scala:237)的scala.Option.getOrElse(Option.scala:120) . 位于org.apache.spark.rdd.RDD上的MapPartitionsRDD.getPartitions(MapPartitionsRDD.scala:35)$$ anonfun $ partitions $ 2.apply(RDD.scala:239)org.apache.spark.rdd.RDD $$ anonfun $ partitions $ 2.apply(RDD.scala:237)位于org.apache.spark.SparkContext的org.apache.spark.rdd.RDD.partitions(RDD.scala:237)的scala.Option.getOrElse(Option.scala:120) .runJob(SparkContext.scala:1952)atg.apache.spark.rdd.RDD $$ anonfun $ aggregate $ 1.apply(RDD.scala:1114)at org.apache.spark.rdd.RDDOperationScope $ .withScope(RDDOperationScope . scala:150)org.apache.spark.rdd.RDDOperationScope $ .withScope(RDDOperationScope.scala:111)位于org.apache.spark的org.apache.spark.rdd.RDD.withScope(RDD.scala:316) . rdd.RDD.aggregate(RDD.scala:1107)org.apache.spark.mll . 位于sun.reflect的sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)的com.aexp.cxp.recommendation.ProductRecommendationIndividual.main(ProductRecommendationIndividual.java:62)上的.mllib.recommendation.MatrixFactorizationModel.predict(MatrixFactorizationModel.scala:126) .nativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)位于org.apache.spark的java.lang.reflect.Method.invoke(Method.java:497)的sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) . deploy.SparkSubmit $ .org $ apache $ spark $ deploy $ org.apache.spark.deploy.SparkSubmit $ .doRunMain $ 1(SparkSubmit.scala:181)org.apache上的$ SparkSubmit $$ runMain(SparkSubmit.scala:742) . 在org.apache.spark.deploy.SparkSubmit.main(SparkSubmit . 斯卡拉)

我需要设置加载模型的配置吗?任何建议都会有很大的帮助 .

1 回答

  • 1

    在Spark中,与任何其他分布式计算框架一样,在尝试调试代码时,了解代码运行的位置非常重要 . 访问各种类型也很重要 . 例如,在YARN中,您将拥有:

    • 如果您自己录制,则会记录主人

    • 聚合的从属日志(感谢YARN,有用的功能!)

    • YARN节点管理器(例如会告诉你容器被杀的原因等)

    如果你从一开始就没有看正确的地方,那么深入研究Spark问题可能非常耗时 . 现在更具体地说,在这个问题上,你有一个清晰的堆栈跟踪,但情况并非如此,所以你应该利用它来获得优势 .

    堆栈跟踪的顶部是

    线程“main”java.io.IOException中的异常:org.apache中的org.apache.hadoop.mapred.FileInputFormat.getSplits(FileInputFormat.java:324)中的文件:maprfs:/ op / tc / model / data不是.gark.rdd.HadoopRDD.getPartitions(HadoopRDD.scala:199)atg.apache.spark.rdd.RDD $$ anonfun $ partitions $ 2.apply(RDD.scala:239)at org.apache.spark.rdd.RDD $$ anonfun $在org.apache.spark.rdd.RDD.partitions(RDD.scala:237)的scala.Option.getOrElse(Option.scala:120)处分区$ 2.apply(RDD.scala:237) . apache.spark.rdd.MapPartitionsRDD.getPartitions(MapPartitionsRDD.scala:35)at at

    如您所见,Spark作业在失败时正在执行 map 操作 . 谁执行 map ?因此,您必须确保您的文件在所有从站上都可用,而不仅仅是在主站上 .

    更一般地说,您总是需要在为主服务器编写的代码和为从服务器编写的代码之间明确区分 . 这对你有所帮助检测这种交互,以及对不可序列化对象的引用和此类常见错误 .

相关问题