2016-08-17 5 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.HardopRDD.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.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 $ 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.RDDのscala.Option.getOrElse(Option.scala:120) の の$ anonfun $ partitions $ 2.apply(RDD.scala:237) パーティション(RDD.scala:237) at org.apache.spark.SparkContext.runJob(SparkContext.scala:1952) at org.apache.spark.rdd.RDD $$ anonfun $ aggregate $ 1.apply(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) で太陽にjava.lang.reflectのでsun.reflect.NativeMethodAccessorImpl.invokeで.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド) sun.reflect.DelegatingMethodAccessorImpl.invokeで(NativeMethodAccessorImpl.java:62) (DelegatingMethodAccessorImpl.java:43) 。 Method.invoke(Method.java:497) at org.apache.spark。(SparkSubmit.scala:181) at org.apache.spark.deploy.SparkSubmit $ .doRunMain $ 1(SparkSubmit.scala:181) at org.apache.spark.deploy.SparkSubmit $。 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'の使用をお勧めしません。私はまだスパークの設定でそれを見たことがない – Dici

答えて

1

他の分散コンピューティングフレームワークと同様に、Sparkでは、コードをデバッグしようとするときにコードがどこで実行されているかを理解することが重要です。また、さまざまなタイプにアクセスすることも重要です。例えば、YARNに、あなたが持っているでしょう:

  • マスターログたとえば、レコードそれらを自分
  • 集約されたスレーブ・ログ(おかげ糸、便利な機能!)
  • YARNノードマネージャ(意志コンテナが殺された理由など
  • )などを教えてくれ

あなたが最初から適切な場所を見ていない場合はスパークの問題を掘り下げることは非常に時間がかかることがあります。ここでは特にこの質問について明確なスタックトレースがありますが、必ずしもそうであるとは限りません。ないファイル: maprfs: org.apache.hadoopで/ OP/TC /モデル/データ

スタックトレースの先頭には、スレッド "メイン" にjava.io.IOExceptionで

例外です.mapred.FileInputFormat.getSplits(FileInputFormat.java:324) at org.apache.spark.rdd.HardopRDD.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あなたが見ることができるように、スパークジョブはmapを実行していた

で : org.apache.spark.rdd.MapPartitionsRDD.getPartitions(35 MapPartitionsRDD.scala)で:D.partitions(237 RDD.scala)失敗したときの操作。誰がmapを実行しますか?したがって、スレーブは、マスタだけでなく、すべてのスレーブでファイルを使用できることを確認する必要があります。

さらに一般的には、マスター用に書いているコードと、スレーブ用に書いているコードの間にはっきりと区別する必要があります。これは、この種のやりとりだけでなく、非直列化可能オブジェクトやそのような一般的な間違いへの参照を検出するのにも役立ちます。

関連する問題