2016-04-01 32 views
1

Simüle edilmiş bir tıklama akışından farklı kullanıcıları tahmin etmek için HyperLogLog kullanan Java'da Spark Streaming ile bir prototip uygulaması oluşturdum.Spark Tek bir tuşla paralel paralellik

Çözümümü kısaca çizelim.
JavaDStream<String> fullvisitorids = directKafkaStream.map(line -> line._2().split(",")[0]);

(benim HyperLogLog-Object) küresel durumu korumak için tek yol: Ben Gereken tek alan, fullVisitorId içeren bir akış oluşturmak Oradan
JavaPairReceiverInputDStream<String, String> directKafkaStream = KafkaUtils.createStream(streamingContext, ZOOKEEPER_ADDRESS, ZOOKEEPER_GROUP, topics);

: Önce KafkaUtils bir akış oluşturmak Ben udpateStateByKey veya mapWithState yöntemleri buldum. Her ikisi de bir anahtar-değer çifti gerektiriyor ... ama benim kullanımımda bir anahtara ihtiyacım yok.
fullvisitorids.mapToPair(value -> new Tuple2<String, String>("key", value));

Ama şimdi sorularım:

Bu yüzden bir "kukla anahtar" kullanmaya karar
a) Kıvılcım tek tek anahtar bu derenin üzerinde updateStateByKey veya mapWithState ile dönüşümleri parallelize nasıl etkiliyor? Ya da RDD'yi kümelenme üzerinde nasıl bölüyor?

b) Sorunumda, herhangi bir işlevi olmayan bir kukla anahtar eklemekten daha iyi bir çözüm var mı?

cevap

1

a) Karma bölümleyiciyi anahtar için tek bir değerle kullanırsanız akış paralel olmaz. Kendi bölümleyicinizi tanımlayın ya da tek bir anahtar kullanmayın. Genel çözüm için tasarlanmamış olan çözüm, updateStateByKey kullanılmamalıdır. Sadece global tek HLL nesnesini kullanmalısınız, ör. Algebird'den (here is a Gist that demonstrates how this might look).

+0

Teşekkürler. b) Böyle bir çözümün bir kümeye nasıl dağıtılacağı tam olarak nasıl? – JayKay