通过Spark作业服务器运行Mlib

时间:2016-07-19 10:18:13

标签: scala hadoop apache-spark-mllib spark-jobserver bigdata

我正在使用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 jobserver运行它,但我得到错误,

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

我确定它是因为传递了一个字符串值,而程序期望它是矢量元素,有人可以指导我如何实现这一点。这也是数据在生产环境中传递给Model的方式吗?或者是其他方式。

1 个答案:

答案 0 :(得分:2)

Spark Job-server用于生产用例,您可以在其中设计Spark作业的管道,还可以(可选)通过REST API在作业之间使用SparkContext。 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库本身提供的spark-submit脚本SparkSubmit