2016-12-01 23 views
2

我已經培訓了一個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分類器?

回答

1

儘管我喜歡the linked post中提出的解決方案,但以下情況也是可能的。您當然可以將該模型複製到將要部署Webservice的服務器上,在其上安裝一臺機器的Spark「集羣」,並將Spark作業服務器放在其上,以處理請求和訪問火花。如果你的模型不需要大量的計算能力,那將是無可挑剔的解決方案,應該可以工作。