scala - 如何通过 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) =>
    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内部生成的情况(GradientBoostedTreesModel是在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")
}

"

关于scala - 如何通过 Spark MLlib 并行训练和预测?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35463238/

相关文章:

斯卡拉 : Match of parameter Type

scala - 替换字符串中出现的键->值对

java - 在创建数据集时使用 @JsonProperty 重命名 spark 中的列

python - Spark 数据框不添加具有空值的列

scala - 自动映射和 "implicit conversion must be more specific then Any Ref"错误

scala - 如何使用 scala 代码在 Play framework 2.3.x 中启用 HSTS?

apache-spark - 检查 Spark 流作业是否挂起的最佳方法

apache-spark - 如何在 spark mllib 中进行基于项目的推荐?

scala - 管道能成为变压器吗?

python-3.x - 拆分 RDD 以进行 K 折验证 : pyspark