【发布时间】:2016-04-01 21:30:13
【问题描述】:
我用 Java 中的 Spark Streaming 构建了一个原型应用程序,它使用 HyperLogLog 从模拟的点击流中估计不同的用户。
让我简要概述一下我的解决方案。首先,我使用 KafkaUtils 创建一个流:JavaPairReceiverInputDStream<String, String> directKafkaStream = KafkaUtils.createStream(streamingContext, ZOOKEEPER_ADDRESS, ZOOKEEPER_GROUP, topics);
从那里我创建一个只包含必填字段 fullvisitorid 的流:JavaDStream<String> fullvisitorids = directKafkaStream.map(line -> line._2().split(",")[0]);
为了维护全局状态(我的 HyperLogLog-Object),我发现的唯一方法是 udpateStateByKey 或 mapWithState 方法。两者似乎都需要一个键值对......但在我的用例中我不需要一个键。
所以我决定使用“虚拟密钥”:fullvisitorids.mapToPair(value -> new Tuple2<String, String>("key", value));
但现在我的问题是:
a) Spark 如何在这个只有一个键的流上使用 updateStateByKey 或 mapWithState 并行化转换?或者它如何在集群上对 RDD 进行分区?
b) 对于我的问题,有没有比添加一个根本没有任何功能的虚拟密钥更好的解决方案?
【问题讨论】:
标签: java apache-spark streaming state partitioning