我已经培训了一个Spark多层感知器分类器来检测垃圾邮件,并希望在Web服务中结合Play框架使用它。
我的解决方案(见下文)产生一个嵌入式本地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分类器?
答案 0 :(得分:1)
虽然我喜欢the linked post中提出的解决方案,但也可能采用以下方法。您当然可以将该模型复制到将部署Web服务的服务器上,安装spark" cluster"在它上面放一台机器并在它上面放置spark jobserver,它将处理请求并访问spark。如果您的模型不需要大量的计算能力,这将是非常简单的解决方案,并且应该可行。