4

私は 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

バッチモードとして。ただし、このソリューションにはメンテナンスのオーバーヘッドが必要であり、コード ベースの重複に起因するエラーのリスクがあります。

バッチ モードのコードを可能な限り再利用して、同じ結果に到達するためのより良い方法はありますか?

前もって感謝します。

4

1 に答える 1

1

あなたのソリューションはエレガントです。

私は他の解決策を持っています.それはあなたのものよりもエレガントではありませんが、より効率的かどうかはわかりません. これは mapToPairFunction に基づく私のソリューションです

JavaPairDStream<String, Integer> distinctElems = elemsStream
       .mapToPair(event -> new Tuple2<String, Integer>(event,1));
distinctElems = distinctElems.reduceByKey((t1, t2) -> t1);

その方が効率的だと思いますが、テストできません。

于 2015-02-27T10:17:18.263 に答える