一、数据倾斜状况
大表join小表,默认使用mapjoin。大表内存1.2G,小表5M,通过省份关联,大表中部分省份数据是热点数据,map阶段数据倾斜,个别task执行时长远远大于其他task。
二、问题分析
热点省份数据大量分到同一个task中执行,maptask单个任务处理数据256M,只有17个maptask任务。map任务太少导致相同key分到同一个任务中。考虑增加maptask数量分散热点数据。
三、参数调整
--单个maptask处理数据量,3.2M
set mapred.max.split.size=3200000;
--单个reducetask处理数据量,12.8M
set hive.exec.reducers.bytes.per.reducer=12800000;
hivesql结尾加上distribute by rand(),可以调整reduce阶段输出的文件数量和平均分布文件大小(加上之前我的文件是15个,最大13G,最小240M;加上之后变成文件103个,每个大小在660M左右),如果想指定存储文件数量可以用distribute by cast( rand() * num as int) ,num数值是多少,存储文件数量就是多少。
四、测试情况
各阶段执行时长 单个task处理数据量 各阶段数量
map:2m55s 6.4M map数量192
reduce:7m 6.4M reduce数量205
map:11m5s 6.4M map数量192
reduce:12m47s 64M reduce数量21
map:2m51s 6.4M map数量192
reduce:3m 12.8M reduce数量103
map:2m14s 6.4M map数量192
reduce:3m43s 25.6M reduce数量52
map:4m3s 12.8M map数量93
reduce:4m26s 12.8M reduce数量103
map:1m49s 3.2M map数量394
reduce:2m25s 12.8M reduce数量103
五、结果分析
根据测试结果可以得出结论,当map数量越多时,map阶段执行的越快,map阶段数量固定时,reduce数量从小到大执行时长会先变短后变长。选择合适的map数量和reduce数量可以明细提高任务执行效率。