在没有嵌入式火花群的情况下将Spark ML模型集成在Scala应用中



我已经训练了Spark多层perceptron分类器来检测垃圾邮件消息,并希望将其与Play Framework结合使用。

我的解决方案(见下文)产生了一个嵌入式的本地火花群集,加载模型并分类消息。有没有嵌入式火花群的使用模型的方法?

Spark具有一些与游戏框架依赖性冲突的依赖关系。我认为可能有一种方法可以在分类模式下运行模型,而无需启动嵌入式火花群集。

我的第二个问题是我是否可以在不将单个消息放入数据框中的情况下对单个消息进行分类。

应用程序加载程序:

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分类器?

尽管我喜欢链接的帖子中提出的解决方案,但也可能是可能的。当然,您可以将该模型复制到将部署网络服务的服务器,在其上安装一台机器的Spark"群集",然后将Spark airserver放在其顶部,这将处理请求并访问Spark。那将是无限制的解决方案,如果您的模型不需要大量的计算能力,则应有效。

最新更新