2016-08-17 35 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?因此,您必須確保您的文件在所有從站上可用,而不僅限於主站。

更一般地說,您總是需要在您爲主服務器編寫的代碼和爲奴隸編寫的代碼之間明確區分頭腦。這將幫助您檢測這種交互,以及對不可序列化對象的引用和常見錯誤。

相關問題