所以我知道 Spark 可以在单个 RDD 上执行迭代算法,例如逻辑回归。
val points = spark.textFile(...).map(parsePoint).cache()
var w = Vector.random(D) // current separating plane
for (i <- 1 to ITERATIONS) {
val gradient = points.map(p =>
(1 / (1 + exp(-p.y*(w dot p.x))) - 1) * p.y * p.x
).reduce(_ + _)
w -= gradient
}
上面的例子是迭代的,因为它维护了一个w
在每次迭代后更新的全局状态,并且它的更新值在下一次迭代中使用。这个功能在 Spark 流中是否可行?考虑同样的例子,除了现在points
是一个 DStream。在这种情况下,您可以创建一个新的 DStream 来计算梯度
val gradient = points.map(p =>
(1 / (1 + exp(-p.y*(w dot p.x))) - 1) * p.y * p.x
).reduce(_ + _)
但是您将如何处理全局状态w
。似乎w
也必须是一个 DStream (updateStateByKey
可能使用),但是它的最新值需要以某种方式传递给points
我认为不可能的 map 函数。我不认为 DStreams 可以以这种方式进行通信。我是正确的,还是可以在 Spark Streaming 中进行这样的迭代计算?