我已經培訓了一個Spark多層感知器分類器來檢測垃圾郵件,並且希望將它用於與Play框架結合使用的web服務。在Scala應用中整合Spark ML模型而不嵌入Spark集羣
我的解決方案(見下文)生成一個嵌入式本地Spark集羣,加載模型並對消息進行分類。有沒有一種方法可以在沒有嵌入式Spark集羣的情況下使用模型?
Spark有一些與Play Framework依賴關係衝突的依賴關係。我認爲可能有一種方法可以在分類模式下運行模型,而無需啓動嵌入式火花集羣。
我的第二個問題是,如果我可以將一條消息分類而不先將它放入DataFrame中。
加載應用程序:
lazy val sparkSession: SparkSession = {
val conf: SparkConf = new SparkConf()
.setMaster("local[*]")
.setAppName("Classifier")
.set("spark.ui.enabled", "false")
val session = SparkSession.builder()
.config(conf)
.getOrCreate()
applicationLifecycle.addStopHook {() ⇒
Future { session.stop() }
}
session
}
lazy val model: PipelineModel = {
sparkSession
CrossValidatorModel.load("mpc-model").bestModel.asInstanceOf[PipelineModel]
}
分類服務(模型和火花會話注入):
val messageDto = Seq(MessageSparkDto(
sender = message.sender.email.value,
text = featureTransformer.cleanText(text).value,
messagelength = text.value.length,
isMultimail = featureTransformer.isMultimail(message.sender.email),
))
val messageDf = messageDto.toDS()
model.transform(messageDf).head().getAs[Double]("prediction") match {
case 1.0 ⇒ MessageEvaluationResult(MessageClass.Spam)
case _ ⇒ MessageEvaluationResult(MessageClass.NonSpam)
}
編輯:正如在評論中指出,一個解決辦法將模型轉換爲PMML,然後使用另一個引擎加載模型並將其用於分類。這聽起來太像我很多的開銷了。是否有人在本地模式下運行spark,並且使用最小的開銷和依賴關係來使用ML分類器?