2016-10-30 14 views
2

Sparkによって保存されたRandomForestClassificationModelをロードできません。PySpark RandomForestClassifierモデルを読み込めないのはなぜですか?

環境:Apache Spark 2.0.1、小型(4マシン)クラスタで動作するスタンドアロンモード。 HDFSなし - すべてがローカルディスクに保存されます。

ビルドしてモデルを保存:

classifier = RandomForestClassifier(labelCol="label", featuresCol="features", numTrees=50) 
model = classifier.fit(train) 
result = model.transform(test) 
model.write().save("/tmp/models/20161030-RF-topics-cats.model") 

その後、別のプログラムで:

model = RandomForestClassificationModel.load("/tmp/models/20161029-RF-topics-cats.model") 

います:

Py4JJavaError: An error occurred while calling o81.load. 
: org.apache.spark.sql.AnalysisException: Unable to infer schema for ParquetFormat at /tmp/models/20161029-RF-topics-cats.model/treesMetadata. It must be specified manually; 
    at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$16.apply(DataSource.scala:411) 
    at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$16.apply(DataSource.scala:411) 
    at scala.Option.getOrElse(Option.scala:121) 
    at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:410) 
    at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:149) 
    at org.apache.spark.sql.DataFrameReader.parquet(DataFrameReader.scala:439) 
    at org.apache.spark.sql.DataFrameReader.parquet(DataFrameReader.scala:423) 
    at org.apache.spark.ml.tree.EnsembleModelReadWrite$.loadImpl(treeModels.scala:441) 
    at org.apache.spark.ml.classification.RandomForestClassificationModel$RandomForestClassificationModelReader.load(RandomForestClassifier.scala:301 

私はときに私と同じコードが動作することに注意したいですNaive Bayes分類器を使用してください。

答えて

1

モデルをHDFSに保存し、後でそのモデルをHDFSから読み込むと、問題が解決する場合があります。

ノードが4つあり、各ノードには独自のローカルディスクがあります。 あなたがmodel.writeを()を使用している

その後、別のプログラムで( "/ TEMP/XXX")を保存します。 があるので、あなたが負荷( "/ TEMP/XXX")

を使用しています4つの異なるローカルディスクを持つ4ノードでは、write.save()操作中に正確に何が保存されているか(そしてどのローカルディスクに)何が正確にload() -ディスク。

+0

ええ、私はその問題に精通しています。私はsymlink/tmp/modelsを各ノード上の永続的な記憶域に割り当てることで、すべてのノードにアクセスできるようになります(つまり、各マシンが同じ場所で同じファイルを見つけることができます)。この機能は、DataFramesや未処理のCSVデータなどの機能パレットを読み込む場合に有効です。 –

+0

@NickLothianしかし、シンボリックリンクでは、ノードはお互いのファイルを上書きしませんか?あなたはそれがうまくいくと言った、なぜ分かったの? – braunmagrin

+0

これはノードローカルディスクなので、あるノードが別のノード上のファイルを上書きする方法はありません。 –

関連する問題