したがって、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 でこのような反復計算を行うことは可能ですか?