读取hdfs文件之后repartition 避免数据倾斜
场景一:
api:
textFile("hfds://....").map((key,value)).reduceByKey(...).map(实际的业务计算逻辑)
场景:hdfs的某个文件有183个block,他们的大小分布非常不均匀时,比如有的是200M,有的是1M,有的是10K。此时spark计算非常非常慢,通过web ui监视发现,有的task处理了好几百M的数据,有的
task之处理了几k,导致严重的数据倾斜。
其中stage0阶段有183个task,这个阶段几乎没有什么计算任务,主要就是从hdfs上读取数据,stage0一共读取了5.4G的压缩后的lzo数据,耗时在9.3Min左右。
让人痛苦的是,在reduceByKey时,reduce数量也是183个,从这里噩梦就开始了,耗时在2个多小时还没有计算完毕。
原因:默认情况下,spark 的初始rdd的partition数量和hdfs的block 数量大小一致,在上面这个场景下,初始rdd的partition个数就是183,并且后面的reduceByKey等都是183,可以通过在textFile之后
repartition一下,可以将次数设置的小一点,这样那些小的block就会聚合到一个parttion了。
2.场景2,groupByKey要比reduceByKey快
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 单线程的Redis速度为什么快?
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库