私は Spark 初心者で、spark ストリーミングと spark バッチを使用してラムダ アーキテクチャを実装したいと考えています。
ネットで調べていたら、以下の記事を見つけました。
http://blog.cloudera.com/blog/2014/08/building-lambda-architecture-with-spark-streaming/
これは私の分析の一部では問題ありませんが、個別の要素を見つける必要がある場合、この解決策は実行可能ではないと思います。
JavaRDD で個別の要素を見つけたい場合は、distinct メソッドを使用できます。DStreams は RDD のセットなので、適用する場合
transform((rdd) -> rdd.distinct())
Dstream のメソッドでは、ストリームの各 rdd で個別を実行するため、DStream 全体ではなく、各 RDD で個別の要素を見つけることができます。
そのように書くと少し混乱するかもしれないので、例を挙げて明確にしましょう:
次の要素があります。
Apple
Pear
Banana
Peach
Apple
Pear
バッチ アプリで:
JavaRDD<String> elemsRDD=sc.textFile(exFilePath).distinct()
子 RDD には以下が含まれます。
Apple
Pear
Banana
Peach
私が正しく理解していれば、これはストリームの動作であるはずです:
1 秒のバッチ時間と 2 秒のウィンドウがあるとします。
最初のRDD:
Apple
Pear
Banana
2 番目の RDD:
Peach
Apple
Pear
JavaDStream<String> elemsStream=(getting from whathever source)
childStream = elemsStream.transform((rdd) -> rdd.distinct())
childStream.forEachRDD...
2 つの Rdd で終了します。
Apple
Pear
Banana
2番:
Peach
Apple
Pear
これはRDDに関しては明確ですが、DStreamに関してはそうではありません。
ストリーミング部分の私の解決策は次のとおりです。
JavaDStream<HashSet<String>> distinctElems = elemsStream.map(
(elem) -> {
HashSet<String> htSet = new HashSet<String>();
htSet.add(elem);
return htSet;
}).reduce((sp1, sp2) -> {
sp1.addAll(sp2);
return sp1;
});
このようにして、結果は次のようになります。
Apple
Pear
Banana
Peach
バッチモードとして。ただし、このソリューションにはメンテナンスのオーバーヘッドが必要であり、コード ベースの重複に起因するエラーのリスクがあります。
バッチ モードのコードを可能な限り再利用して、同じ結果に到達するためのより良い方法はありますか?
前もって感謝します。