Smile — Сохранение модели — Как записывать модели в HDFS?

#scala #hdfs #smile

#scala #hdfs #улыбка

Вопрос:

Я пытаюсь использовать Smile в своем проекте Scala, который использует Spark и HDFS. Для повторного использования моих моделей мне нужно записать их в HDFS.

Прямо сейчас я использую объект записи, проверяя, существует ли путь заранее, и создаю его, если это не так (в противном случае это вызвало бы исключение FileNotFoundException) :

 import java.nio.file.Paths

val path: String = "hdfs:/my/hdfs/path"
val outputPath: Path = Paths.get(path)
val outputFile: File = outputPath.toFile
if(!outputFile.exists()) {
  outputFile.getParentFile().mkdirs();  // This is a no-op if it exists
  outputFile.createNewFile();
}
write(mySmileModel, path)
  

но это создает локально путь «hdfs:/my/hdfs /path» и записывает в него модель вместо фактической записи в HDFS.
Обратите внимание, что использование модели spark и ее метода сохранения работает:

 mySparkModel.save("hdfs:/my/hdfs/path")
  

Поэтому мой вопрос: как написать модель Smile в HDFS?
Аналогично, если мне удастся записать модель в HDFS, я, вероятно, также задамся вопросом, как прочитать модель из HDFS.

Спасибо!

Комментарии:

1. Взгляните на index.scala-lang.org/pierrenodet/spark-smile/spark-smile /…

2. Я столкнулся с той же проблемой, вы наконец нашли решение?

3. @leleogere да, позвольте мне добавить свое собственное решение в качестве ответа

4. Хорошее решение, я думаю, это правильный путь. Спасибо

5. @leleogere Добро пожаловать! рад, что это может вам помочь

Ответ №1:

В конце концов, я решил свою проблему, написав собственный метод сохранения для своего класса-оболочки, который примерно равен:

 import org.apache.hadoop.fs.{FSDataInputStream, FSDataOutputStream, FileSystem, Path}
import org.apache.hadoop.conf.Configuration
import java.io.{ObjectInputStream, ObjectOutputStream}

val path: String = /my/hdfs/path
val file: Path = new Path(path)
val conf: Configuration = new Configuration()
val hdfs: FileSystem = FileSystem.get(new URI(path), conf)
val outputStream: FSDataOutputStream = hdfs.create(file)
val objectOutputStream: ObjectOutputStream = new ObjectOutputStream(outputStream)
objectOutputStream.writeObject(model)
objectOutputStream.close()
  

Аналогично, для загрузки сохраненной модели я написал метод, выполняющий примерно следующее:

 val conf: Configuration = new Configuration()
val path: String = /my/hdfs/path
val hdfs: FileSystem = FileSystem.get(new URI(path), conf)
val inputStream: FSDataInputStream = hdfs.open(new Path(path))
val objectInputStream: ObjectInputStream = new ObjectInputStream(inputStream)
val model: RandomForest = objectInputStream.readObject().asInstanceOf[RandomForest]