Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Scala应用程序中集成Spark ML模型,无需嵌入Spark群集_Scala_Apache Spark_Apache Spark Ml - Fatal编程技术网

在Scala应用程序中集成Spark ML模型,无需嵌入Spark群集

在Scala应用程序中集成Spark ML模型,无需嵌入Spark群集,scala,apache-spark,apache-spark-ml,Scala,Apache Spark,Apache Spark Ml,我已经训练了一个Spark多层感知器分类器来检测垃圾邮件,并希望将其与Play框架结合在Web服务中使用 我的解决方案(见下文)生成一个嵌入式本地spark集群,加载模型并对消息进行分类。有没有一种方法可以在没有内置Spark cluster的情况下使用该模型 Spark具有一些与Play框架依赖项冲突的依赖项。我认为有一种方法可以在分类模式下运行模型,而无需启动嵌入式spark群集 我的第二个问题是,我是否可以对单个消息进行分类,而不首先将其放入数据帧中 应用程序加载器: lazy val s

我已经训练了一个Spark多层感知器分类器来检测垃圾邮件,并希望将其与Play框架结合在Web服务中使用

我的解决方案(见下文)生成一个嵌入式本地spark集群,加载模型并对消息进行分类。有没有一种方法可以在没有内置Spark cluster的情况下使用该模型

Spark具有一些与Play框架依赖项冲突的依赖项。我认为有一种方法可以在分类模式下运行模型,而无需启动嵌入式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)
}
分类服务(注入型号和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分类器的经验?

虽然我喜欢中提出的解决方案,但也可以使用以下方法。当然,您可以将该模型复制到将部署Web服务的服务器上,安装一个带有一台机器的spark“集群”,并将spark jobserver放在上面,它将处理请求并访问spark。如果你的模型不需要太多的计算能力,这将是一个不需要动脑筋的解决方案