apache-spark - Spark 和 Kafka:如何提高生产者发送大量记录的并行度以提高网络使用率?
问题描述
我正在潜水以了解如何将大量记录从 Spark 发送(生成)到 Kafka 主题。
从文档中我可以看到,有人试图在同一个工作人员的任务中使用同一个生产者。当一次发送大量记录时,网络将成为瓶颈(以及内存,因为 kafka 会缓冲要发送的记录)。所以我想知道提高网络使用率的最佳配置是什么:
- 更少的工人拥有更多的核心(所以我想,这意味着更多的线程)
- 更多的工人,每个工人的核心更少(所以我想我们会使用更好的网络 IO,因为它会分布在不同的机器上)
假设我对 1 和 2 的选项如下(来自 Databricks):
- 4 个工人,每个工人 16 个核心 = 64 个核心
- 10 个工人,每个工人 4 个核心 = 40 个核心
为了更好地利用网络IO,哪个是最好的选择?
我现在对此的想法,但我不确定,所以我在这里问你:虽然从 CPU 的角度来看(昂贵的计算工作),1)会更好(更多的并发性,更少的洗牌),从从网络 IO 的角度来看,我宁愿使用 2),即使我的内核总体上会更少。
感谢您对此的任何意见。
谢谢你们。
解决方案
最好的解决方案是让更多的工作人员来实现并行性(水平扩展)。DataFrame 必须使用以 Kafka 作为接收器的流式传输写入 Kafka,如此处所述https://docs.databricks.com/spark/latest/structured-streaming/kafka.html(如果您不想拥有持久流,您可以总是使用一次选项触发器)。此外,您可以假设 1 个数据帧分区 = 1cpu,因此您可以另外优化这种方式(但流式传输中的数据块通常会自动处理它)。
在 Kafka 方面,我想拥有与 spark/databricks 工作人员类似的分区/代理数量可能会很好。
推荐阅读
- python-3.x - 在 Raspberry Pi 4 中循环 500 次后,while 循环(Python)变慢
- android - 新版本上传失败
- facebook - 如何获得 facebook 验证的登录方法(电子邮件或电话号码)?
- python - OpenCV 特定颜色提取
- java - 使用Java查找数组中3的最后一个倍数
- ios - PhotoData 中的视频无法播放
- python - 匹配并行数据框中的多索引
- android - 滚动外部 recyclerview 以显示内部 recyclerview + 部分标题
- python - 如何找到特定范围内的所有整数集?
- class - 为什么可以修改 Raku 类的只读数组属性?