Spark 和 Kafka:如何增加生产者发送大批量记录的并行度以提高网络使用率?
Spark and Kafka: how to increase parallelism for producer sending large batch of records improving network usage?
我正在深入了解如何从 Spark 向 Kafka 主题发送(生成)大量记录。
从 the docs 我可以看到有人试图在同一个工人的任务中使用同一个生产者。 当一次发送大量记录时,网络将成为瓶颈(以及内存,因为 kafka 会缓冲要发送的记录)。所以我想知道提高网络使用率的最佳配置是什么:
- 更少的工人拥有更多的核心(所以我想,这意味着更多的线程)
- 更多的工人,每个工人的核心更少(所以我想我们会使用更好的网络 IO,因为它将分布在不同的机器上)
假设我对 1 和 2 的选择如下(来自 Databricks):
- 4 个工人,每个工人 16 个核心 = 64 个核心
- 10 个工人,每个工人 4 个内核 = 40 个内核
为了更好的利用网络IO,哪个是最好的选择?
目前我的想法是,但我不确定,所以我在这里问你:
尽管从 CPU 的角度(昂贵的计算作业)来看,1) 会更好(更高的并发性,更少的混洗),但从网络 IO 的角度来看,我宁愿使用 2) 即使我愿意总体上有更少的核心。
感谢对此的任何意见。
谢谢大家
最好的解决方案是让更多的worker来实现并行(横向扩展)。 DataFrame 必须使用 Kafka 流式传输作为接收器写入 Kafka,如此处所述 https://docs.databricks.com/spark/latest/structured-streaming/kafka.html (如果您不想拥有持久流,您始终可以使用选项触发器一次)。
此外,您可以假设 1 个数据帧分区 = 1cpu,因此您可以额外优化这种方式(但流式传输中的数据块通常会自动处理)。
在 Kafka 方面,我想 partitions/brokers 的数量与 spark/databricks worker 的数量相似可能会很好。
我正在深入了解如何从 Spark 向 Kafka 主题发送(生成)大量记录。
从 the docs 我可以看到有人试图在同一个工人的任务中使用同一个生产者。 当一次发送大量记录时,网络将成为瓶颈(以及内存,因为 kafka 会缓冲要发送的记录)。所以我想知道提高网络使用率的最佳配置是什么:
- 更少的工人拥有更多的核心(所以我想,这意味着更多的线程)
- 更多的工人,每个工人的核心更少(所以我想我们会使用更好的网络 IO,因为它将分布在不同的机器上)
假设我对 1 和 2 的选择如下(来自 Databricks):
- 4 个工人,每个工人 16 个核心 = 64 个核心
- 10 个工人,每个工人 4 个内核 = 40 个内核
为了更好的利用网络IO,哪个是最好的选择?
目前我的想法是,但我不确定,所以我在这里问你: 尽管从 CPU 的角度(昂贵的计算作业)来看,1) 会更好(更高的并发性,更少的混洗),但从网络 IO 的角度来看,我宁愿使用 2) 即使我愿意总体上有更少的核心。
感谢对此的任何意见。
谢谢大家
最好的解决方案是让更多的worker来实现并行(横向扩展)。 DataFrame 必须使用 Kafka 流式传输作为接收器写入 Kafka,如此处所述 https://docs.databricks.com/spark/latest/structured-streaming/kafka.html (如果您不想拥有持久流,您始终可以使用选项触发器一次)。 此外,您可以假设 1 个数据帧分区 = 1cpu,因此您可以额外优化这种方式(但流式传输中的数据块通常会自动处理)。
在 Kafka 方面,我想 partitions/brokers 的数量与 spark/databricks worker 的数量相似可能会很好。