【发布时间】:2018-06-18 01:53:18
【问题描述】:
我在 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,这是否正确?换句话说,它只会看到来自用户 ID 的消息发送到 3 个分区之一?
那么我的问题:
-
如何正确设置此参数以消费发送到
my.topic的所有消息?我的直觉是我只需将主题参数设置为
{'my.topic': 3},那么我的问题就变成了: -
为什么我会使用小于分区总数的数字?
我的直觉告诉我,这取决于你正在做的工作有多“原子”。例如,如果我只是简单地将数据转换(例如,从 CSV 转换为 JSON 文档列表或其他内容)然后将上述 3 个流中的每个流都设置为
{'my.topic': 1}作为它们的主题参数,并且同一消费者组的所有部分将是通过启用每个分区的并行消费来获得好处,因为不需要共享有关所消费的每条消息的信息。同时,如果我正在计算旨在涵盖整个主题的实时指标 I.E.带有过滤器等的时间窗平均值。我很难找到一种方法来实现类似的东西而不设置
{'my.topic': 3},或者如果它像一个总和,那么对消费者组内的每个组件信号进行稍微复杂的下游处理即Sum1 + Sum2 + Sum3 = TotalSum但我的知识再次处于与 Kafka 和 Spark 玩耍的“初出茅庐”阶段。
有没有办法告诉 createStream() 从所有分区消费,而无需提前知道有多少?
{'my.topic': -1}之类的东西?可以在一个流中指定多个主题吗? IE。
{'my.topic': 1, 'my.other.topic': 1}
我真的很讨厌这个问题的答案只是“是的,你的直觉是正确的。”。最好的情况是有人告诉我我误解了一切并让我直截了当。所以请...这样做!
【问题讨论】:
标签: python pyspark apache-kafka spark-streaming