履歴データをRDDセットに移動するSparkフレームワークを開発しています。
基本的に、RDD は不変で、操作を行う読み取り専用のデータセットです。それに基づいて、履歴データを RDD に移動し、そのような RDD でフィルタリング/マッピングなどの計算を行います。
現在、RDD 内のデータのサブセットが更新され、値を再計算する必要があるユース ケースがあります。
HistoricalData は RDD の形式です。リクエスト スコープに基づいて別の RDD を作成し、その RDD の参照をScopeCollectionに保存します。
これまでのところ、以下のアプローチを考えることができました-
アプローチ 1: 変更をブロードキャストします。
- 変更リクエストごとに、サーバーはスコープ固有の RDD をフェッチし、ジョブを生成します
- ジョブで、その RDD にマップ フェーズを適用します -
2.a。RDD の各ノードに対して、ブロードキャストでルックアップを実行し、現在更新されている新しい値を作成して、新しい RDD を作成し
ます。次に、step2.a で、この新しい RDD に対してすべての計算を再度実行します。乗算、削減など
2.c. この RDD 参照を ScopeCollection に保存します
アプローチ 2: 更新用の RDD を作成する
- 変更リクエストごとに、サーバーはスコープ固有の RDD をフェッチし、ジョブを生成します
- 各RDDで、変更のある新しいRDDと結合します
- ステップ 2 で、この新しい RDD で乗算、リダクションなどのすべての計算を再度実行します。
アプローチ 3:
同じRDDを更新し続けて再計算するストリーミングRDDを作成することを考えていました。しかし、私が理解している限りでは、Flume または Kafka からストリームを受け取ることができます。私の場合、値はユーザーの操作に基づいてアプリケーション自体で生成されます。したがって、私のコンテキストでは、ストリーミング RDD の統合ポイントが見当たりません。
どのアプローチが優れているか、またはこのシナリオに適した他のアプローチに関する提案。
ティア!