Scala 如何通过Spark MLlib并行训练和预测?

Scala 如何通过Spark MLlib并行训练和预测?,scala,apache-spark,apache-spark-mllib,Scala,Apache Spark,Apache Spark Mllib,我必须解决不同限制条件下的回归问题。他们有一系列的标准和规则,我必须建立模型,并对每一个进行预测,将所有的数据合并并保存。 因此,现在我的解决方案如下所示: criteria2Rules: List[(String, Set[String])] var result: RDD[(Id, Double)] = sc.parallelize(Array[(Id, Double)]()) criteria2Rules.foreach { case (criterion, rules) =>

我必须解决不同限制条件下的回归问题。他们有一系列的标准和规则,我必须建立模型,并对每一个进行预测,将所有的数据合并并保存。 因此,现在我的解决方案如下所示:

criteria2Rules: List[(String, Set[String])]

var result: RDD[(Id, Double)] = sc.parallelize(Array[(Id, Double)]())
criteria2Rules.foreach {
  case (criterion, rules) =>
    val trainDataSet: RDD[LabeledPoint] = prepareTrainSet(criterion, data)
    val model: GradientBoostedTreesModel = buildModel(trainDataSet)
    val predictionDataSet = preparePredictionDataSet(criterion, data)
    val predictedScores = predictScores(predictionDataSet, model, criterion, rules)
    result = result.union(predictedScores)
}
它工作得几乎不错,但是太慢了,原因是GradientBoostedTreesModel训练没有那么快,特别是在有大量特征、样本和使用标准的情况下。 我想如果Spark能够训练模型并并行进行预测,它可能会工作得更好

我尝试使用关系式的数据操作方式:

val criteria2RulesRdd: RDD[(String, Set[String])]

val cartesianCriteriaRules2DataRdd = criteria2RulesRdd.cartesian(dataRdd)
cartesianCriteriaRules2DataRdd
  .aggregateByKey(List[Data]())(
    { case (lst, tuple) => lst :+ tuple }, { case (lstL, lstR) => lstL ::: lstR}
  )
  .map {
    case (criteria, rulesSet, scorePredictionDataList) =>
      val trainSet = ???
      val model = ???
      val predictionSet = ???
      val predictedScores = ???
  }
  ...
但它不可避免地带来了这样一种情况:一个RDD在另一个RDD中生成(GradientBoostedTrees模型是在RDD[LabeledPoint]上训练的),据我所知,这是一种糟糕的情况


有没有办法并行使用Spark MLlib?

我在Spark用户邮件列表中问了同样的问题,得到了答案:

“如果您有一个大的集群,您可以在驱动程序的不同线程中触发培训作业。将RDD放在RDD中不起作用。简单示例:

(0 until 10).par.foreach { i =>
  val n = sc.parallelize(0 until 1000000).count()
  println(s"$i: $n")
}
"