2016-07-19 8 views
0

Ich habe die Entwicklung von Beispiel-Modell mit Online-Ressourcen in Spark-Website zur Verfügung gestellt. Ich habe es geschafft, das Modell zu erstellen und es für Beispieldaten mit Hilfe von Spark-Shell auszuführen. Aber wie wird das Modell tatsächlich in der Produktionsumgebung ausgeführt? Ist es über Spark Job Server?Running Mlib über Spark-Job-Server

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) 

Der obige Code funktioniert perfekt, wenn ich es in Funken Shell laufen, aber ich habe keine Ahnung, wie wir eigentlich Modell in der Produktionsumgebung ausführen. Ich versuchte es über Funken Job Server zu laufen, aber ich Fehler erhalten,

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

Ich bin sicher sein, weil ein String-Wert am vorbei, während das Programm es Vektorelemente werden erwartet, Kann jemand mich leiten, wie dies zu erreichen. Und wie werden die Daten in der Produktionsumgebung an Model übergeben? Oder ist es anders?

Antwort

2

Spark Job-Server wird in Produktions-Anwendungsfällen verwendet, in denen Sie Pipelines von Spark-Jobs entwerfen und (optional) den SparkContext über Jobs hinweg über eine REST-API verwenden möchten. Sparkplug ist eine Alternative zu Spark Job-Server, die ähnliche Konstrukte bietet.

Um jedoch Ihre Frage zu beantworten, wie ein (singulärer) Spark-Job in Produktionsumgebungen ausgeführt wird, ist die Antwort, dass Sie keine Bibliothek eines Drittanbieters benötigen. Sie müssen nur ein SparkContext-Objekt erstellen und damit Spark-Jobs auslösen. Zum Beispiel für Ihr Code-Snippet, alles was benötigt wird ist;

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) 
    } 


} 

Optional können Sie auch den Wrapper verwenden für Skript Funken einreichen, SparkSubmit, in der Spark-Bibliothek zur Verfügung gestellt selbst.

+0

Hallo Sujith, vielen Dank für die Erläuterung und Beispielcode. Ich glaube, dass meine Schlussfolgerung zur Verwendung des Spark-Job-Servers für die Bereitstellung der in der Produktionsumgebung eingebauten Model korrekt war. Aber ich habe noch Tonnen von Fragen, die ich glaube, wird klar werden, wie ich tiefer in dies eintauchen. Zum Beispiel sagen wir, dass ich dieses Stück Code als ein Spark Jar veröffentliche und ich möchte den Code über den Funke-Job-Server auf einem entfernten Rechner ausführen. Irgendein Hinweis darauf, wie ich die Eingabezeichenfolge als Vektor übergeben oder die Zeichenfolge in einen Vektor umwandeln kann, mit dem ich die Ausgabe vorhersagen und das Ergebnis zurückgeben kann. Kurz gesagt, wie kann ich neue Daten übergeben –

+0

@AsheshNair Die REST-API von Spark-Jobserver ist für die Verwaltung von Spark-Jobs vorgesehen, und daher Eingaben an die Jobs nicht als Parameter an die REST-Aufrufe übergeben werden. Es wird nur eine POST-Entität erwartet, bei der es sich um eine TypeSafe Config-Formatdatei handelt. Es wird beim Start mit der Konfigurationsdatei des Jobservers zusammengeführt. – suj1th

+0

@AsheshNair Das übliche Produktionsszenario besteht darin, dass jede Eingabe, die ein Spark-Job benötigt, entweder aus einem Datenbank-/HDFS-Speicher gelesen oder aus einer Konfigurationsdatei gelesen wird. – suj1th