我有以下用例:
50名学生编写自己的代码,使用预加载的数据集,并且会重复多次。他们都需要完成相同的任务:按顺序读取数据,并对其进行处理。数据集是一个包含6亿条消息的时间序列,每条消息大约有1.3KB。处理可能在火花,但不是强制性的。数据集是固定的,并且是ReadOnly。
对于每个用户,数据应该以“合理的速度”>30 be /秒的速度读取。
我正在考虑用3+代理、1个主题和50个分区来设置kafka集群。
我对上述计划的问题是,每个学生(==消费者)都必须读取所有数据,而不管其他消费者做什么。
卡夫卡适合这样吗?如果是这样的话,是怎么做的?
如果我放宽了按顺序读取数据集的要求,该怎么办?也就是说,消费者可以以任何顺序读取6亿条消息。在这种情况下,每个消费者只需提取全部主题(从“最早的”开始),这是正确的吗?
另一种方法是设置HDFS存储(我们使用Azure,因此它被称为storage ),只需提供一个挂载点。但是,在这种情况下,我无法控制吞吐量。
吞吐量计算:
假设有25个消费者同时运行,每次读取为30 25 /s -> 750 25/s。假设数据是从磁盘读取的,且磁盘速率为50 15 /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?
Is it possible to read from multiple partitions using Kafka Simple Consumer?
发布于 2022-09-11 01:54:37
处理可能在Spark中,但不是强制性的,另一种方法是设置HDFS存储(我们使用Azure)。
火花可以从Azure Blob存储中读到,所以我建议你先从这个开始。您可以很容易地并行地扩展火花执行器以获得吞吐量。
如果想要使用卡夫卡,不要仅以磁盘速度为基础,特别是当卡夫卡可以进行零拷贝传输时。使用kafka-consumer-perf-test
脚本测试使用者使用一个分区的速度。或者,更好的是,如果您的数据有一些键,而不是时间戳,您可以订购,然后使用它。
目前还不清楚每个"50名学生“是否对数据集进行相同的处理,或者可以进行一些预计算,但如果可以,可以设置Kafka Streams KTables来聚合数据的一些静态统计信息,如果所有数据都是通过一个主题进行流的,那么您可以为这些查询分发负载,而不需要50个并行使用者。
否则,我的第一个想法就是简单地使用像OpenTSDB、时间刻度或流入之类的TSDB,也许是Druid。也可以与火花一起使用,也可以直接查询。
发布于 2022-09-11 14:35:22
如果您使用的是Apache 3.0+,那么每个分区绑定的使用者都可以使用不同的方法,因为它可以使用更多的执行器线程,而不是分区,所以这主要取决于您的网络和磁盘的速度。Kafka在内存中存储最新的偏移量,因此对于您的用例来说,大多数读取都是从内存中读取的。
希望从Kafka读取最少数量的分区。默认情况下,星火有一个从卡夫卡消耗的topicPartitions到星火分区的1-1映射。如果您将此选项设置为大于您的topicPartitions的值,那么Spark将将大型Kafka分区分割成更小的部分。请注意,这个配置就像一个提示:星火任务的数量大约是minPartitions。它可以是更少或更多取决于舍入错误或卡夫卡分区,没有收到任何新的数据。
https://spark.apache.org/docs/3.0.1/structured-streaming-kafka-integration.html
https://stackoverflow.com/questions/73671008
复制相似问题