首页 > 解决方案 > Spark 和 Kafka:如何提高生产者发送大量记录的并行度以提高网络使用率?

问题描述

我正在潜水以了解如何将大量记录从 Spark 发送(生成)到 Kafka 主题。

文档中我可以看到,有人试图在同一个工作人员的任务中使用同一个生产者。当一次发送大量记录时,网络将成为瓶颈(以及内存,因为 kafka 会缓冲要发送的记录)。所以我想知道提高网络使用率的最佳配置是什么:

  1. 更少的工人拥有更多的核心(所以我想,这意味着更多的线程)
  2. 更多的工人,每个工人的核心更少(所以我想我们会使用更好的网络 IO,因为它会分布在不同的机器上)

假设我对 1 和 2 的选项如下(来自 Databricks):

  1. 4 个工人,每个工人 16 个核心 = 64 个核心
  2. 10 个工人,每个工人 4 个核心 = 40 个核心

为了更好地利用网络IO,哪个是最好的选择?

我现在对此的想法,但我不确定,所以我在这里问你:虽然从 CPU 的角度来看(昂贵的计算工作),1)会更好(更多的并发性,更少的洗牌),从从网络 IO 的角度来看,我宁愿使用 2),即使我的内核总体上会更少。

感谢您对此的任何意见。

谢谢你们。

标签: apache-sparknetworkingapache-kafkaspark-structured-streamingspark-streaming-kafka

解决方案


最好的解决方案是让更多的工作人员来实现并行性(水平扩展)。DataFrame 必须使用以 Kafka 作为接收器的流式传输写入 Kafka,如此处所述https://docs.databricks.com/spark/latest/structured-streaming/kafka.html(如果您不想拥有持久流,您可以总是使用一次选项触发器)。此外,您可以假设 1 个数据帧分区 = 1cpu,因此您可以另外优化这种方式(但流式传输中的数据块通常会自动处理它)。

在 Kafka 方面,我想拥有与 spark/databricks 工作人员类似的分区/代理数量可能会很好。


推荐阅读