2016-07-19 7 views
0

私はsparkウェブサイトで提供されているオンラインリソースを使用してサンプルモデルを開発していました。私はモデルを作成し、Spark-Shellを使ってサンプルデータ用に実行しましたが、実稼動環境でモデルを実際に実行するにはどうすればいいですか?それはスパークジョブサーバー経由ですか?Spark Job Server経由でMlibを実行

import org.apache.spark.mllib.classification.SVMWithSGD 
import org.apache.spark.mllib.regression.LabeledPoint 
import org.apache.spark.mllib.linalg.Vectors 

val data = sc.textFile("hdfs://mycluster/user/Cancer.csv") 
val parsedData = data.map { line => 
    val parts = line.split(',') 
    LabeledPoint(parts.last.toDouble,  Vectors.dense(parts.take(9).map(_.toDouble))) 
} 
var svm = new SVMWithSGD().setIntercept(true) 
val model = svm.run(parsedData) 
var predictedValue = model.predict(Vectors.dense(5,1,1,1,2,1,3,1,1)) 
println(predictedValue) 

上記のコードはspark-shellで実行すると完璧に動作しますが、実際に運用環境でモデルを実際にどのように実行するかはわかりません。私はプログラムがベクトル要素であることを期待に対し、そのためには、誰かがこれを達成するためにどのように私を導くことができる、文字列値を渡しています確信している

curl -d "input.string = 1, 2, 3, 4, 5, 6, 7, 8, 9" 'ptfhadoop01v:8090/jobs?appName=SQL&classPath=spark.jobserver.SparkPredict' 

、私はスパークジョブサーバを経由して、それを実行しようとしたが、私はエラーを取得します。また、実稼働環境でモデルにデータを渡す方法は?それとも別の方法ですか?

答えて

2

Spark Job-serverは、Sparkジョブのパイプラインを設計し、REST APIを介して(オプションで)SparkContextをジョブ全体で使用する実用的なユースケースで使用されます。 SparkplugはSpark Job-serverの代替品で、同様の構成を提供しています。

しかし、本番環境で(単数の)スパークジョブを実行する方法に関する質問に答えるには、サードパーティ製のライブラリを必要としないという答えがあります。 SparkContextオブジェクトを作成し、それを使用してSparkジョブをトリガーする必要があります。たとえば、コードスニペットの場合、必要なのはすべてです。

package runner 

import org.apache.spark.mllib.classification.SVMWithSGD 
import org.apache.spark.mllib.regression.LabeledPoint 
import org.apache.spark.mllib.linalg.Vectors 

import com.typesafe.config.{ConfigFactory, Config} 
import org.apache.spark.{SparkConf, SparkContext} 
/** 
* 
*/ 
object SparkRunner { 

    def main (args: Array[String]){ 

    val config: Config = ConfigFactory.load("app-default-config") /*Use a library to read a config file*/ 
    val sc: SparkContext = constructSparkContext(config) 

    val data = sc.textFile("hdfs://mycluster/user/Cancer.csv") 
    val parsedData = data.map { line => 
     val parts = line.split(',') 
     LabeledPoint(parts.last.toDouble, Vectors.dense(parts.take(9).map(_.toDouble))) 
    } 
    var svm = new SVMWithSGD().setIntercept(true) 
    val model = svm.run(parsedData) 
    var predictedValue = model.predict(Vectors.dense(5,1,1,1,2,1,3,1,1)) 
    println(predictedValue) 
    } 


    def constructSparkContext(config: Config): SparkContext = { 
    val conf = new SparkConf() 
    conf 
     .setMaster(config.getString("spark.master")) 
     .setAppName(config.getString("app.name")) 
    /*Set more configuration values here*/ 

    new SparkContext(conf) 
    } 


} 

オプションで、スパークライブラリ自体に提供火花提出スクリプトのラッパー、SparkSubmitを、使用することができます。

+0

こんにちはsujith、説明とサンプルコードをお寄せいただきありがとうございます。私は、本番環境に組み込まれたModelを展開するためにspark-jobサーバーを使用することについての私の推測は正しいと考えています。 しかし、私はまだこれに深く掘り下げていくにつれて明らかになるだろうと考えている疑問がたくさんあります。今のところ、私はこのコードをSpark Jarとしてデプロイしています。リモートマシンのspark Jobサーバー経由でコードを実行したいとします。私はどのように入力文字列をベクトルとして渡すか、文字列をベクトルに変換して出力を予測し、その結果を返すことができます。つまり、新しいデータをどうやって渡すことができるのですか? –

+0

@AsheshNair spark-jobserverが提供するREST APIは、Sparkジョブを管理するためのものであり、ジョブへの入力はREST呼び出しのパラメータとして渡されません。型保証設定書式ファイルであるPOSTエンティティのみが必要です。起動時にジョブサーバの設定ファイルとマージされます。 – suj1th

+0

@AsheshNair通常の生産シナリオでは、Sparkジョブが必要とする入力は、データベース/ HDFSストアから読み取るか、設定ファイルから読み込むことです。 – suj1th

関連する問題