2016-08-17 33 views
1

我正在尝试使用Spark协作过滤来实现推荐系统。Spark ML-未能使用MatrixFactorizationModel加载模型

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

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

当我使用单独的过程中,程序失败,并以下例外加载模型:
代码:

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/"); 

例外:

线程“main”异常java.io.IOException:不是文件: maprfs:/ op/tc/model/data at org.apache.hadoop.mapred.FileInputFormat.getSplits(FileInputFormat.java:324) 在org.apache.spark.rdd.HadoopRDD.getPartitions(HadoopRDD.scala:199) 在org.apache.spark.rdd.RDD $$ anonfun $分区$ 2.适用(RDD.scala:239) 在org.apache在scala.Option.getOrElse(Option.scala:120) 在org.apache.spark.rdd.RDD.partitions(RDD:.spark.rdd.RDD $$ anonfun $ $分区2.适用(237 RDD.scala) .scala:237) at org.apache.spark.rdd.MapPartitionsRDD.getPartitions(MapPartitionsRDD.scala:35) at org.apache.spark.rdd.RDD $$ anonfun $ partitions $ 2.apply(RDD.scala:239 ) 在org.apache.spark.rdd.RDD $$ anonfun $分区$ 2.适用(RDD.scala:237) 在scala.Option.getOrElse(Option.scala:120) 在org.apache.spark.rdd。 RDD.partitions(RDD.scala:237) at org.apache.spark.rdd.MapPartitionsRDD.getPartitions(MapPartitionsRDD.scala:35) at org.apache.spark.rdd.RDD $$ anonfun $ partitions $ 2.apply( RDD.scala:239) at org.apache.spark.rdd.RDD $$ anonfun $ partitions $ 2.apply(RDD.scala:237) at scala.Option.getOrElse(Option.scala:120) at org。 apache.spark.rdd.RDD.partitions(RDD.scala:237) at org.apache.spark.rdd.MapPartitionsRDD.getPartitions(MapPartitionsRDD.scala:35) at org.apache.spark.rdd.RDD $$ anonfun $ partitions $ 2.apply(RDD.scala:239) at org.apache.spark.rdd.RDD $$ anonfun $分区$ 2.适用(RDD.scala:237) 在scala.Option.getOrElse(Option.scala:120) 在org.apache.spark.rdd.RDD。分区(RDD.scala:237) 在org.apache.spark.SparkContext.runJob(SparkContext.scala:1952) 在org.apache.spark.rdd.RDD $$ anonfun $总$ 1.适用(RDD.scala: 1114) at org.apache.spark.rdd.RDDOperationScope $ .withScope(RDDOperationScope.scala:150) at org.apache.spark.rdd.RDDOperationScope $ .withScope(RDDOperationScope.scala:111) at org.apache。 spark.rdd.RDD.withScope(RDD.scala:316) at org.apache.spark.rdd.RDD.aggregate(RDD.scala:1107) at org.apache.spark.mllib.recommendation.MatrixFactorizationModel.countApproxDistinctUserProduct( MatrixFactorizationModel .scala:96) 在org.apache.spark.mllib.recommendation.MatrixFactorizationModel.predict(MatrixFactorizationModel.scala:126) 在com.aexp.cxp.recommendation.ProductRecommendationIndividual.main(ProductRecommendationIndividual.java:62) 在太阳.reflect.NativeMethodAccessorImpl.invoke0(本机方法) 在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在java.lang.reflect中。 Method.invoke(Method.java:497) at org.apache.spark。deploy.SparkSubmit $ .org $ apache $ spark $ deploy $ SparkSubmit $$ runMain(SparkSubmit.scala:742) at org.apache.spark.deploy.SparkSubmit $ .doRunMain $ 1(SparkSubmit.scala:181) at org。 apache.spark.deploy.SparkSubmit $ .submit(SparkSubmit.scala:206) at org.apache.spark.deploy.SparkSubmit $ .main(SparkSubmit.scala:121) at org.apache.spark.deploy.SparkSubmit。主要(SparkSubmit.scala)

是否有任何配置我需要设置为加载模型?任何建议都会很有帮助。

+0

我认为这很清楚。你的文件不存在(至少,它不存在于奴隶,因为我们可以看到它正在做一个映射操作) – Dici

+0

如果我加载模型在我保存它的同一个进程。它不会抱怨:( –

+0

)在一个侧面节点上,我不推荐使用'allowMultipleContexts'。我从来没有在Spark配置中看到过它,这意味着它仍然没有足够的支持来将它暴露给 – Dici

回答

1

在任何其他分布式计算框架中,在试图调试代码时,了解代码在哪里运行非常重要。访问各种类型也很重要。例如,在纱,你会:

  • 主日志如果记录他们自己
  • 聚集从日志(感谢纱,实用的功能!)
  • 纱线节点管理器(例如将告诉你为什么一个容器被打死等)

挖掘到星火问题可能相当耗时,如果你不看从一开始就正确的地方做。现在更具体地讲这个问题,你有一个明确的堆栈跟踪,这并不总是如此,所以你应该使用它来获得你的优势。

栈跟踪的顶部是

异常在线程 “主” java.io.IOException的:不是一个文件: maprfs:/ OP/TC /模型/数据在 org.apache.hadoop .mapred.FileInputFormat.getSplits(FileInputFormat.java:324) at org.apache.spark.rdd.HadoopRDD.getPartitions(HadoopRDD.scala:199) at org.apache.spark.rdd.RDD $$ anonfun $ partitions $ 2 .apply(RDD.scala:239) at org.apache.spark.rdd.RDD $$ anonfun $ partitions $ 2.apply(RDD.scala:237) at scala.Option.getOrElse(Option.scala:120)at org.apache.spark.rdd.RD D.partitions(RDD.scala:237)在 org.apache.spark.rdd.MapPartitionsRDD.getPartitions(MapPartitionsRDD.scala:35) 在

正如你所看到的,星火作业执行map操作失败时。谁执行map?因此,您必须确保您的文件在所有从站上可用,而不仅限于主站。

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

相关问题