2016-10-30 4 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()를 사용하고 저장 ("/ 온도/XXX") : 당신은 부하를 사용하는 ("/ 온도/XXX")

있기 때문에 4 개의 노드가 있고 4 개의 다른 로컬 디스크가있는 경우 write.save() 작업 중에 정확히 어떤 것이 저장되고 있는지 (그리고 어떤 로컬 디스크에 저장되었는지) 명확하지 않으며 정확하게 load -디스크.

+0

그래, 나는 그 문제에 익숙하다. 각 노드의 영구 저장 장치에 symlink/tmp/models를 사용하면 모든 노드에서 액세스 할 수 있습니다 (즉, 각 시스템이 동일한 위치에서 동일한 파일을 찾을 수 있음). 이는 DataFrames 또는 원시 CSV 데이터와 같은 기능 파 파트를로드하는 데 적합합니다. –

+0

@NickLothian 그러나 심볼릭 링크로 노드가 서로의 파일을 덮어 쓰지 않습니까? 너 괜찮 았어, 왜 그런지 알아? – braunmagrin

+0

이들은 노드 로컬 디스크이므로 한 노드가 다른 노드의 파일을 덮어 쓸 수있는 방법이 없습니다. –

관련 문제