使用Sparkling Water(Scala)导入POJO模型



我正在尝试将POJO模型导入Sparkling Water。我目前正在通过使用编译来导入模型

javac -cp /opt/bitnami/commons/pojo.jar -J-Xmx2g -J-XX:MaxPermSize=256m /opt/bitnami/commons/GBM_model_python_1642760589977_1.java

在这之后,我使用hex.genmodel.genmodel加载它,类似于这样的东西:

val classLocation = new File("/opt/bitnami/commons/").toURL
valLocation = Array[java.net.URL](classLocation)
val classLoader = new URLClassLoader(Location,classOf[GenModel].getClassLoader)
val cls = Class.forName("GBM_model_python_1642760589977_1", true, classLoader)
val model: GenModel = cls.newInstance().asInstanceOf[GenModel]

问题是在进行预测时,我对URLClassLoader:有问题

val easyModel = new EasyPredictModelWrapper(model)
classLoader.close()
val header = model.getNames 
val outputType = easyModel.getModelCategory 
val predictionRdd = testData.rdd.map(row => {
val r = new RowData
header.indices.foreach(idx => r.put(header(idx), row.getDouble(idx).asInstanceOf[AnyRef]))
val prediction = easyModel.predictMultinomial(r)
prediction
})

引发异常:

org.apache.spark.SparkException: Task not serializable
Caused by: java.io.NotSerializableException: java.net.URLClassLoader
Serialization stack:

我不知道为什么,因为我认为URLClassLoader没有使用。我试着用classLoader.close()来解决它,但没有成功。

我的问题是:有没有一种更简单的方法可以将POJO模型导入Sparkling Water?如果是这样的话,这是一种理想的方式,现在我正在本地编译模型,但我需要将它们保存在S3中…有没有什么方法可以加载模型而不必在本地编译,比如将其保存在内存中或其他什么地方?如何解决序列化问题?

您正试图在运行时编译POJO,然后将其分发给执行器。出于某种原因——您的代码也在分发URLClassloader(这与POJO无关,POJO本身是可串行化的(——URLClassloader不可串行化。

我认为这种方法通常不起作用,因为如果在驱动程序上编译类并序列化它,那么它在执行器上就不可用了。

一个更好的方法是在提交作业时将类放在类路径和其他Spark jar中。

相关内容

  • 没有找到相关文章

最新更新