【总结】一不小心的Map端数据倾斜
MapReduce任务的数据倾斜一般指的是Reduce端数据倾斜,Map端怎么还会出现数据倾斜呢。~~
创新互联建站始终坚持【策划先行,效果至上】的经营理念,通过多达十载累计超上千家客户的网站建设总结了一套系统有效的全网营销推广解决方案,现已广泛运用于各行各业的客户,其中包括:成都PE包装袋等企业,备受客户称扬。
Mapper任务如下图所示,其中一个map任务耗时特别长
跑了一个ETL程序,两个Map分别读取两类数据,一个是lzo格式,另外一个是txt格式。
map任务通常是一个数据块一个map,为什么其中一个map计算会如此耗时呢,分别查看两个数据文件的分块情况
输入1有50个分块
输入2有11个分块
查看任务一共才有52个map。map格式应该是50+11=61个才对。
有如下结论
MultipleInputs两个输入,有一个在数据输入的时候没有Split成功,考虑到其中一个输入是lzo,极有可能是该文件没有index索引造成。
于是检查lzo文件所在目录中,检查是否存在lzo.index文件。
存在lzo.index文件,还能造成读取数据没有进行分块处理,于是检查代码发现,在处理lzo文件的时候采用了TextInputFormat(代码标红位置处已修改为LzoTextInputFormat)。
所以没有按照lzo.index进行文件分块。一个lzo文件都在一个map里面进行计算处理。导致处理数据map个数不对,并且其中一个map处理耗时长。
if (commonPath != null && commonPath.length() != 0) {
MultipleInputs.addInputPath(job, new Path(commonPath.toString()), TextInputFormat.class, MidHotelMapper.class);
} else {
logger.error("输入路径为空:-->{}", conf.get(CommonConstant.COMMON_TASK_INPUT));
System.exit(-1);
}
if (ctripPath != null && ctripPath.length() != 0) {
MultipleInputs.addInputPath(job, new Path(ctripPath.toString()), LzoTextInputFormat.class, MidCtripHotelMapper.class);
} else {
logger.error("输入路径为空:-->{}", conf.get(Constant.CTRIP_TASK_INPUT));
System.exit(-1);
}
修改之前这ETL任务平均耗时在16分钟左右。
修改之后,耗时只用2分钟。
竟然用TextInputFormat跑了两年的ETL。终于。。。有空查了一下修改过来
分享文章:【总结】一不小心的Map端数据倾斜
本文来源:http://azwzsj.com/article/ghgpds.html