我可以使用Kafka进行多个独立的消费者顺序读取吗?

3htmauhk  于 2022-09-21  发布在  Kafka
关注(0)|答案(2)|浏览(680)

我有以下使用案例:
50名学生编写自己的代码,该代码使用预加载的数据集,他们将重复多次。它们都需要完成相同的任务:按顺序读取数据,并对其进行处理。数据集是一个包含6亿条消息的时间序列,每条消息约为1.3KB。处理可能会在Spark进行,但不是强制性的。数据集是固定的和只读的。

对于每个消费者,数据的读取速度应大于30MB/秒。

我正在考虑将Kafka集群设置为3+经纪人,1个主题,50个分区。

我对上述计划的问题是,无论其他消费者做什么,每个学生(==消费者)都必须阅读所有数据。

Kafka适合做这件事吗?如果是这样的话,是如何做到的呢?

如果我放宽按顺序读取数据集的要求,会怎么样?即,消费者可以以任何顺序阅读这6亿条消息。在这种情况下,每个消费者只需拉出完整的主题(从“最早”开始),这是正确的吗?

另一种选择是设置一个HDFS存储(我们使用Azure,所以它被称为存储帐户),并简单地提供一个挂载点。然而,在这种情况下,我无法控制吞吐量。

吞吐量计算:
假设有25个用户同时运行,每个用户的读数为30MB/s->750MB/s。假设从磁盘读取数据,并且磁盘率为50MB/s,我需要同时从750/50=15个磁盘读取数据。这是不是意味着我需要有15个经纪人?我没有看到一个代理如何将分区分配给连接到它的几个磁盘。

类似的帖子:

Kafka topic partitions to Spark streaming

How does one Kafka consumer read from more than one partition?

(Spring) Kafka appears to consume newly produced messages out of order

Kafka architecture many partitions or many topics?

可以使用Kafka Simple Consumer读取多个分区吗?

lh80um4z

lh80um4z1#

处理可能会在Spark进行,但不是强制性的

另一种选择是设置HDFS存储(我们使用Azure)

Spark可以从Azure Blob存储中读取,所以我建议你首先从这开始。您可以轻松地并行扩展Spark Executor以提高吞吐量。

如果要使用Kafka,不要只根据磁盘速度来计算消耗速度,尤其是在Kafka可以进行零拷贝传输的情况下。使用kafka-consumer-perf-test脚本测试您的用户使用一个分区的速度。或者,更好的做法是,如果您的数据具有除时间戳之外的其他可供排序的关键字,则使用该关键字。

还不清楚是每个“50名学生”对数据集进行相同的处理,还是可以进行一些预计算,但如果是这样的话,可以设置Kafka Streams KTables来聚合数据的一些静态统计数据,如果这些数据都流经一个主题,那么,您可以为这些查询分配负载,而不需要50个并行使用者。

否则,我的第一个想法就是简单地使用TSDB,比如OpenTSDB、TimeScale或Inflx,也许是Druid。它也可以与Spark一起使用,或者直接查询。

xdnvmnnf

xdnvmnnf2#

如果你使用的是ApacheSpark 3.0+,有一些方法可以绕过每个分区限制的使用者,因为它可以比分区使用更多的执行程序线程,所以这主要是关于你的网络和磁盘的速度。Kafka将最新的偏移量存储在内存中,因此对于您的用例来说,大多数读取可能是从内存中进行的。
从Kafka读取的所需最小分区数。默认情况下,Spark有topicPartitions到Spark Partitions的1-1Map,Spark Partitions消耗Kafka。如果您将此选项设置为大于topicPartitions的值,Spark会将较大的Kafka分区划分为较小的部分。请注意,此配置类似于一个提示:Spark任务的数量将大约为minPartitions。它可能或多或少地取决于舍入误差或没有接收到任何新数据的Kafka分区。

https://spark.apache.org/docs/3.0.1/structured-streaming-kafka-integration.html

相关问题