spark.mllib

时间:2015-12-16 13:16:21

标签: scala apache-spark parallel-processing apache-spark-mllib

假设我有data类型的对象Array[RDD]。 我想在此对象的每个RDD上学习独立机器学习模型。例如,随机森林:

data.map{ d => RandomForest.trainRegressor(d,2,Map[Int,Int](),2,"auto","gini",2,10) }

当我使用spark-submit --master yarn-client ...启动此作业时,独立学习任务似乎并未在多个节点上并行化。几乎所有工作都只由一个节点(即此处的节点10)完成,因为它可以在应用程序UI的屏幕截图中看到:

enter image description here

附录

为完整起见,整个代码如下:

import org.apache.spark.SparkContext
import org.apache.spark.SparkConf
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.mllib.tree.RandomForest


object test {
  def main(args: Array[String]) {

    val conf = new SparkConf().setMaster("local").setAppName("test")
    conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
    val sc = new SparkContext(conf)

    // Load data
    val rawData = sc.textFile("data/mllib/sample_tree_data.csv")
    val data = rawData.map { line =>
      val parts = line.split(',').map(_.toDouble)
      LabeledPoint(parts(0), Vectors.dense(parts.tail))
    }

    val CV_data = (1 to 100).toArray.map(_ => {val splits = data.randomSplit(Array(0.7, 0.3)) ;  splits(0)})

    CV_data.map(d => RandomForest.trainClassifier(d, 2, Map[Int, Int](), 2, "sqrt", "gini", 2, 100))

    sc.stop()
    System.exit(0)
  }
}

1 个答案:

答案 0 :(得分:1)

问题是RandomForest.trainClassifier可以被视为动作,因为它急切地触发了一些涉及的RDD计算的执行。因此,无论何时调用RandomForest.trainClassifier,Spark作业都将提交给集群并执行。

由于Scala map上的Array操作是按顺序执行的,因此您最终会逐个执行一个trainClassifier作业。为了并行执行作业,您必须在并行集合上调用map。以下代码片段应该可以解决这个问题:

CV_data.par.map(d => RandomForest.trainClassifier(d, 2, Map[Int, Int](), 2, "sqrt", "gini", 2, 100))