在没有嵌入式Spark Cluster的Scala应用程序中集成Spark ML模型

时间:2016-12-01 15:38:49

标签: scala apache-spark apache-spark-ml

我已经培训了一个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分类器?

1 个答案:

答案 0 :(得分:1)

虽然我喜欢the linked post中提出的解决方案,但也可能采用以下方法。您当然可以将该模型复制到将部署Web服务的服务器上,安装spark" cluster"在它上面放一台机器并在它上面放置spark jobserver,它将处理请求并访问spark。如果您的模型不需要大量的计算能力,这将是非常简单的解决方案,并且应该可行。