2016-12-01 10 views
2

私はスパークメッセージを検出するためにSpark Multilayer Perceptron Classifierを訓練し、Play Frameworkと組み合わせてWebサービスで使用したいと考えています。埋め込みスパーククラスタを使用しないSpala MLモデルの統合

私のソリューション(下記参照)は、組み込みローカルスパーククラスタを生成し、モデルをロードし、メッセージを分類します。埋め込まれたSparkクラスタを使用せずにモデルを使用する方法はありますか?

Sparkには、Play Frameworkの依存関係といくつかの依存関係があります。埋め込まれたスパーククラスターを起動することなく、分類モードでモデルを実行する方法があると思いました。

私の2番目の質問は、1つのメッセージを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に変換し、別のエンジンを使用してモデルをロードし、分類に使用することができます。これはあまりにもオーバーヘッドのように私にも聞こえる。 ML分類器を使用するために最小限のオーバーヘッドと依存性でローカルモードでスパークを実行する経験がありますか?

答えて

1

私はthe linked postで提案された解決策が気に入っていますが、次のようにすることもできます。もちろん、Webserviceをデプロイするサーバーにそのモデルをコピーし、1つのマシンでスパーク「クラスタ」をインストールし、その上にスパーク・ジョブ・サーバーを置くと、要求を処理してスパークにアクセスします。これは簡単な解決策ではなく、モデルに多くの計算能力が必要ない場合にはうまくいくはずです。

関連する問題