Apache spark SGD在Spark MLlib中如何使用流媒体

Apache spark SGD在Spark MLlib中如何使用流媒体,apache-spark,rdd,distributed-computing,apache-spark-mllib,bigdata,Apache Spark,Rdd,Distributed Computing,Apache Spark Mllib,Bigdata,我不太熟悉Spark,不知道如果在StreamingLinearAlgorithm上调用trainOn方法,集群上的RDD在后台会发生什么 val regression = new StreamingLinearRegressionWithSGD() regression.trainOn(someStream) StreamingLinearRegressionWithGd包含实际模型(LinearRegressionModel)以及学习算法(LinearRegressionWithGd)作为

我不太熟悉Spark,不知道如果在StreamingLinearAlgorithm上调用trainOn方法,集群上的RDD在后台会发生什么

val regression = new StreamingLinearRegressionWithSGD()
regression.trainOn(someStream)
StreamingLinearRegressionWithGd包含实际模型(LinearRegressionModel)以及学习算法(LinearRegressionWithGd)作为受保护的成员。在方法trainOn中,发生以下情况:

data.foreachRDD { (rdd, time) =>
  if (!rdd.isEmpty) {
    model = Some(algorithm.run(rdd, model.get.weights))
}
据我所知,流数据每x秒分块一次,并将分块的数据放入RDD中。因此,每x秒,学习算法就会应用于一个新的RDD。实际的学习魔术发生在GradientDescent中的某个地方,RDD数据和以前的模型权重向量是输入,更新的权重向量是输出

 val bcWeights = data.context.broadcast(weights)
 // Sample a subset (fraction miniBatchFraction) of the total data
 // compute and sum up the subgradients on this subset (this is one map-reduce)
 val (gradientSum, lossSum, miniBatchSize) = data.sample(false, miniBatchFraction, 42 + i)
    .treeAggregate((BDV.zeros[Double](n), 0.0, 0L))(
      seqOp = (c, v) => {
        // c: (grad, loss, count), v: (label, features)
        val l = gradient.compute(v._2, v._1, bcWeights.value, Vectors.fromBreeze(c._1))
        (c._1, c._2 + l, c._3 + 1)
      },
      combOp = (c1, c2) => {
        // c: (grad, loss, count)
        (c1._1 += c2._1, c1._2 + c2._2, c1._3 + c2._3)
      })
 ...
 val update = updater.compute(
      weights, Vectors.fromBreeze(gradientSum / miniBatchSize.toDouble),
      stepSize, i, regParam)
 weights = update._1
 regVal = update._2
权重向量是如何更新的?它是并行工作的吗?我认为RDD被划分为分区和分布式。我可以看到输入权重是在spark上下文中广播的,总的来说,使用了treeAggregate渐变,但我仍然无法掌握实际的map reduce任务正在发生,驱动程序中发生了哪些部分,以及以并行方式发生了哪些部分。有人能详细解释发生了什么事吗