如何通过 Spark MLlib 并行训练和预测?
How to train and predict in parallel via 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")
}
我必须解决不同限制的回归问题。他们有一堆标准和规则,我必须建立模型并为每个做出预测,合并所有并保存。 所以,现在我的解决方案看起来像:
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")
}