我们正在使用Spark流式传输来自Kafka的消费者记录 我们有13个节点,每个节点有12个核心。
当我们配置了包含24个分区的1个主题时,我们在Spark使用者上配置了24个执行程序和1个核心每个执行程序。在这种情况下没有问题,每个执行程序都被分配来处理主题/分区,并且它从一个批次到另一个批次保持一致(任务位置级别为PROCESS_LOCAL)。
当我们配置2个主题(第一个包含19个分区,第二个包含5个分区)时,我们遇到性能问题,因为主题/分区处理不一致。某些主题/分区被分配在同一个执行器上处理,而不是另一个,这可能导致数据局部性问题(任务位置级别为RACK_LOCAL)。
我们如何在所有执行程序上对主题/分区进行一致处理?
将Spark使用者的配置更改为每个执行程序上有2个核心的12个执行程序无法解决问题,因为在这种情况下,可以将3个任务分配给相同的执行程序。 问题仍然存在,8个执行器有3个内核,6个执行器有4个内核,4个执行器有6个内核。
我已经测试了40个分区的1个主题,但仍然没有数据局部性问题,单个主题处理更加稳定。
Spark 2.1
卡夫卡0.10.1
LocationStrategy = preferConsistent