Запуск Mlib через сервер заданий Spark

Я практиковался в разработке образца модели, используя онлайн-ресурсы, представленные на веб-сайте spark. Мне удалось создать модель и запустить ее для выборки данных с помощью Spark-Shell, но как на самом деле запустить модель в производственной среде? Это через сервер Spark Job?

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, но я понятия не имею, как мы на самом деле запускаем модель в производственной среде. Я попытался запустить его через сервер заданий Spark, но я получаю сообщение об ошибке.

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

Я уверен, что это потому, что я передаю строковое значение, тогда как программа ожидает, что это будут векторные элементы. Может ли кто-нибудь подсказать мне, как этого добиться. А также, как данные передаются в модель в производственной среде? Или это как-то иначе.


person Ashesh Nair    schedule 19.07.2016    source источник


Ответы (1)


Сервер заданий Spark используется в производственных сценариях использования, когда вы хотите спроектировать конвейеры заданий Spark, а также (необязательно) использовать SparkContext для заданий через REST API. Sparkplug — это альтернатива Spark Job-server, предоставляющая аналогичные конструкции.

Однако, чтобы ответить на ваш вопрос о том, как запустить (единственное) задание Spark в производственной среде, ответ заключается в том, что для этого вам не нужна сторонняя библиотека. Вам нужно только создать объект 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)
  }


}

При желании вы также можете использовать оболочку для сценария spark-submit, SparkSubmit, предоставленный в самой библиотеке Spark.

person suj1th    schedule 19.07.2016
comment
Привет, суджит, большое спасибо за разъяснения и пример кода. Я считаю, что мой вывод об использовании сервера spark-job для развертывания модели, встроенной в производственную среду, был правильным. Но у меня все еще есть масса вопросов, которые, я думаю, прояснятся, когда я углублюсь в это. А пока скажем, что я развертываю этот фрагмент кода как Spark Jar, и я хочу запустить код через сервер заданий искры на удаленной машине. Любая подсказка о том, как я могу передать входную строку в виде вектора или преобразовать строку в вектор, который я могу использовать для прогнозирования вывода и возврата результата. Короче говоря, как я могу передать новые данные - person Ashesh Nair; 19.07.2016
comment
@AsheshNair REST API, предоставляемый spark-jobserver, предназначен для «управления» заданиями Spark, и поэтому входные данные для заданий не передаются в качестве параметров вызовам REST. Ожидается только объект POST, который представляет собой файл формата Typesafe Config; он объединяется с файлом конфигурации сервера заданий при запуске. - person suj1th; 19.07.2016
comment
@AsheshNair Обычный производственный сценарий заключается в том, что любые входные данные, которые требуются для задания Spark, либо считываются из базы данных/хранилища HDFS, либо считываются из файла конфигурации. - person suj1th; 19.07.2016