【总结】一不小心的Map端数据倾斜-创新互联

MapReduce任务的数据倾斜一般指的是Reduce端数据倾斜,Map端怎么还会出现数据倾斜呢。~~

成都创新互联公司服务项目包括临桂网站建设、临桂网站制作、临桂网页制作以及临桂网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,临桂网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到临桂省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!

Mapper任务如下图所示,其中一个map任务耗时特别长

【总结】一不小心的Map端数据倾斜

跑了一个ETL程序,两个Map分别读取两类数据,一个是lzo格式,另外一个是txt格式。

map任务通常是一个数据块一个map,为什么其中一个map计算会如此耗时呢,分别查看两个数据文件的分块情况

输入1有50个分块

【总结】一不小心的Map端数据倾斜

输入2有11个分块

【总结】一不小心的Map端数据倾斜

查看任务一共才有52个map。map格式应该是50+11=61个才对。

【总结】一不小心的Map端数据倾斜【总结】一不小心的Map端数据倾斜

有如下结论

MultipleInputs两个输入,有一个在数据输入的时候没有Split成功,考虑到其中一个输入是lzo,极有可能是该文件没有index索引造成。

于是检查lzo文件所在目录中,检查是否存在lzo.index文件。

【总结】一不小心的Map端数据倾斜【总结】一不小心的Map端数据倾斜

存在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。终于。。。有空查了一下修改过来

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


新闻名称:【总结】一不小心的Map端数据倾斜-创新互联
文章位置:http://azwzsj.com/article/dcshoc.html