个别task导致spark任务整体变慢的问题总结

问题:个别task速度慢而拖慢整体任务的问题

现象描述:

1.stage1阶段中的kafka的receiver接受kafka中不同partiton中的相同批次中拉取的记录条数record不同,导致同一个批次的不同task处理时间偏长(处理任务时间倾斜)
在这里插入图片描述
这个要结合业务进行优化(是否可以对kafka分区中对key做hash分区的时候离散化?)

2.随着程序运行,程序的批次任务执行延迟也一直在增加,其中大部分的延迟集中在stage1过程中;
在这里插入图片描述

上图所示:stage1中随着执行时间线推移,任务执行时间也增加了,达到1.5min

早期的执行时间三个stage的执行时间类似这样的
在这里插入图片描述
上图所示:刚开始stage1执行时间比较稳定在30-45s

在这里插入图片描述
图中,部分task数据量不大,但是执行时间很长

原因分析:

1.初步分析
  • 批次任务中,拉取的消息条数有关系(非主因)
  • 批次任务中,拉取的消息体大小有关系(复杂的package中有很多更新)
  • 批次任务中,条数小、消息体也不大,但是恰好这个消息体的对应的业务逻辑很复杂(比如:场景匹配等)
2.状态抓取分析

针对部分执行很慢的task的执行过程;
在这里插入图片描述
任务执行时间越来越长-排队情况加剧

在这里插入图片描述
分区不均匀情况导致的结果

在这里插入图片描述
部分task执行很慢的情况2

在这里插入图片描述
部分task数据量不大,但是执行时间很长

总结一下情况分为三种:

第一种:kafka中数据分布不均匀导致的单个patatition中存入数据过多的问题,导致个别task执行时间很长的问题;

第二种:分区中数据条数不大,但是消息体很大的情况;

第三种:条数不大、消息体不大,执行时间却很长的情况;

针对第一种问题

选取每一个job中的stage1中的task执行时间50对数据,生成的相关性如下。

在这里插入图片描述

taskTime与Rec数量之间正相关

在这里插入图片描述
task执行时间与单位数据体大小相关性

在这里插入图片描述

执行时间与消息体大小相关性

在这里插入图片描述

消息体大小与记录数量之间相关性

总结一下:执行时间TaskTime与消息体大小MsgBody相关性最强,其次消息的条数(数据分布不均匀问题);

建议kafka生产者生产消息的时候保证各个分区的中消息体的大小和数量的均衡;

行时间TaskTime与消息体大小MsgBody相关性最强,其次消息的条数(数据分布不均匀问题);

建议kafka生产者生产消息的时候保证各个分区的中消息体的大小和数量的均衡;

第二种情况:

只能从业务将输入单个消息体更加格式化、拆分为小的消息体

第三种情况:

也从业务部分放置shuffle之后key的倾斜问题,同时对复杂业务逻辑也要拆分合并;

Logo

Kafka开源项目指南提供详尽教程,助开发者掌握其架构、配置和使用,实现高效数据流管理和实时处理。它高性能、可扩展,适合日志收集和实时数据处理,通过持久化保障数据安全,是企业大数据生态系统的核心。

更多推荐