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

What is the correct way to use the "topics" parameter in KafkaUtils.createstream()?

我在 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. 为什么我会使用小于分区总数的数字?

    我的直觉告诉我,这取决于 "atomic" 你正在做的工作如何。例如,如果我只是简单地转换数据(比如,从 CSV 到 JSON 文档列表或其他东西)然后有 3 个上述流,每个流都将 {'my.topic': 1} 设置为它们的主题参数和所有部分相同的消费者组通过从每个分区启用并行消费将是有益的,因为不需要共享关于消费的每条消息的信息。

    与此同时,如果我计算的是整个主题 I.E. 的实时指标。带过滤器的时间窗平均值,等等。我很难找到一种方法来实现类似的东西而不设置 {'my.topic': 3},或者如果它像一个总和,然后对消费者中的每个分量信号进行稍微复杂的下游处理组 I.E. Sum1 + Sum2 + Sum3 = 总和

    但我的知识再次处于 "fledgling" 玩 Kafka 和 Spark 的阶段。

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

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

我真的很讨厌这个问题的答案只是 "Yes, your intuition is correct."。最好的情况是有人告诉我我误解了所有事情并让我直截了当。所以请...这样做!

只要指定不带分区的主题,您将获得该主题中的所有消息,无论该主题中有多少个分区。

您只需看一下示例代码:https://github.com/apache/spark/blob/v2.2.1/examples/src/main/python/streaming/direct_kafka_wordcount.py#L48

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

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

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

选项"Per-topic number of Kafka partitions to consume"表示此接收器将并行读取多少个分区。

例如,您有一个名为 "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.一个流中可以指定多个主题吗? 是的你可以。