Итак, я понимаю, что Spark может выполнять итеративные алгоритмы на одиночных RDD, например, логистической регрессии.Итеративные алгоритмы с потоком Spark
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
), но тогда его последнее значение каким-то образом должно было быть передано в картографическую функцию , которая, как я думаю, невозможна. Я не думаю, что DStreams могут общаться таким образом. Правильно ли, или можно ли проводить итеративные вычисления в Spark Streaming?
Вопрос конкретно касался искрового потока. – user1893354
Удачи вам в искрообразовании. –