【问题标题】:Spark Streaming parallelism with one single key一键实现 Spark Streaming 并行性
【发布时间】: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


    【解决方案1】:

    a) 如果您使用带有单个键值的哈希分区器,则流将不会被并行化。要么定义你自己的分区器,要么不使用单个键。

    b) 解决方案是不使用updateStateByKey,它不适用于全局状态。您应该只使用全局单个 HLL 对象,例如来自 Algebird (here is a Gist that demonstrates how this might look)。

    【讨论】:

    • 谢谢。到 b) 这样的解决方案将如何准确地分布在集群中?
    猜你喜欢
    • 2018-01-13
    • 2015-02-16
    • 2020-05-02
    • 2016-10-20
    • 1970-01-01
    • 2017-12-18
    • 2017-06-19
    • 2020-10-18
    • 1970-01-01
    相关资源
    最近更新 更多