2016-04-01 12 views
1

Spark StreamingでJavaでプロトタイプのアプリケーションを構築しました。このアプリケーションでは、HyperLogLogを使用して、シミュレートされたクリックストリームから別のユーザーを見積もります。スパーク単一のキーでストリーミングの並列化

私の解決策を簡単に説明しましょう。
JavaDStream<String> fullvisitorids = directKafkaStream.map(line -> line._2().split(",")[0]);

は(私のHyperLogLog-Object)をグローバルな状態を維持する唯一の方法:私は唯一の必須フィールド、fullvisitoridを含むストリームを作成します。そこから
JavaPairReceiverInputDStream<String, String> directKafkaStream = KafkaUtils.createStream(streamingContext, ZOOKEEPER_ADDRESS, ZOOKEEPER_GROUP, topics);

:まず私はKafkaUtilsとストリームを作成します私はudpateStateByKeyまたはmapWithStateメソッドが見つかりました。どちらもキーと値のペアを必要とするようですが、私の場合、キーは必要ありません。
fullvisitorids.mapToPair(value -> new Tuple2<String, String>("key", value));

しかし、今、私の質問:

は、だから私は「ダミーの鍵」を使用することにしました
a)のスパークはただ1つのキーを持って、このストリームにupdateStateByKeyまたはmapWithStateとの変換を並列化しない方法は?または、クラスタ上でRDDをどのように分割しますか?

b)私の問題の解決策として、ダミーキーを追加する方法がありますが、これにはまったく機能がありません。

答えて

1

a)キーに単一の値を指定してHashパーティショナーを使用すると、ストリームは並列化されません。独自のパーティショナーを定義するか、単一のキーを使用しないでください。

b)解決策は、グローバル状態用ではないupdateStateByKeyを使用しないことです。グローバルな単一のHLLオブジェクトを使用してください。 Algebird(here is a Gist that demonstrates how this might look)から。

+0

ありがとうございました。 b)そのようなソリューションをどの程度正確にクラスタに分散させるのでしょうか? – JayKay

関連する問題