gpt4 book ai didi

python - 在 KafkaUtils.createstream() 中使用 "topics"参数的正确方法是什么?

转载 作者:行者123 更新时间:2023-11-28 21:38:29 28 4
gpt4 key购买 nike

我在 python 中一起玩 spark-streaming 和 kafka,并松散地跟随 this post但我对前面提到的 KafkaUtils.createStream() 函数有点困惑。

documentation通过明确解释主题词典的影响并没有做太多事情。但我怀疑我之所以这么认为,是因为我对 kafka 的工作原理了解不深,而答案是显而易见的。

我知道它应该是这样的字典:{"topic.name": 1} 我可以重复文档并说这意味着创建的流将从单个分区中消耗。

所以我想我只是在寻找关于这个特定功能的用法以及我对 kafka 概念的理解的一些说明。我们将使用以下示例:

假设我已经定义了一个主题 my.topic,它有 3 个分区,其传入消息按一个键拆分,假设是一个用户 ID。

如果我像这样初始化一个流:

from pyspark.streaming.kafka import KafkaUtils

kafkaStream = KafkaUtils.createStream(
ssc,
'kafka:2181',
'consumer-group-name',
{'my.topic':1}
)

我认为这个流只会从一个分区消费,所以不会看到进入 my.topic 的每条消息,我的想法是否正确?换句话说,它只会看到从 userid 发送到 3 个分区之一的消息?

我的问题是:

  1. 如何正确设置此参数以使用发送到 my.topic 的所有消息?

    我的直觉是我只需将主题参数设置为 {'my.topic': 3},那么我的问题就变成了:

  2. 为什么我会使用小于分区总数的数字?

    我的直觉告诉我,这与您所做的工作的“原子性”程度有关。例如,如果我只是简单地转换数据(比如,从 CSV 到 JSON 文档列表或其他东西)然后将上面的 3 个流都设置为 {'my.topic': 1}它们的主题参数和同一消费者组的所有部分将有利于从每个分区启用并行消费,因为不需要共享有关消费的每条消息的信息。

    与此同时,如果我计算的是整个主题 I.E. 的实时指标。带过滤器的时间窗口平均值等。我很难找到一种方法来实现类似的东西而不设置消费者组 I.E. 中每个分量信号的更复杂的下游处理Sum1 + Sum2 + Sum3 = 总和

    但我的知识还是处于使用 Kafka 和 Spark 的“初级”阶段。

  3. 有没有办法告诉 createStream() 使用所有分区,而无需提前知道有多少分区?类似于 {'my.topic': -1}?

  4. 是否可以在一个流中指定多个主题? IE。 {'my.topic': 1, 'my.other.topic': 1}

我真的很讨厌这个问题的答案只是“是的,你的直觉是正确的。”。最好的情况是有人告诉我我误解了所有事情并让我直截了当。所以请...这样做吧!

最佳答案

这是 Kafka-Spark 集成页面中提到的内容。

val kafkaStream = KafkaUtils.createStream(streamingContext, [ZK quorum], [consumer group id], [per-topic number of Kafka partitions to consume])

KafkaUtils.createStream 将创建一个接收器并使用 Kafka 主题。

“要使用的每个主题的 Kafka 分区数”选项表示此接收器将并行读取多少个分区。

例如,您有一个名为“Topic1”的主题,有 2 个分区,并且您提供了选项“Topic1”:1,那么 Kafka 接收器将一次读取 1 个分区 [它最终会读取所有分区,但会读取一次一个分区]。这样做的原因是读取分区中的消息并保留数据写入主题的顺序。

例如,Topic1 的分区 1 包含消息 {1,11,21,31,41},分区 2 包含消息 {2,12,22,32,42},然后使用上述设置读取将产生类似 { 1,11,21,31,41,2,12,22,32,42}。每个分区中的消息是单独读取的,因此不会混合在一起。

如果您提供的选项为“Topic1”:2,那么接收方将一次读取 2 个分区,并且这些分区中的消息将混合在一起。对于上面相同的启动示例,具有“Topic1”的接收者:2 将产生类似于 {1,2,11,12,21,22....}

将此视为接收器可以对给定主题分区执行的并行读取数。

<强>5。一个流中可以指定多个主题吗?是的你可以。

关于python - 在 KafkaUtils.createstream() 中使用 "topics"参数的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48161253/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com