大数据入门基础系列之MapReduce数据倾斜及解决方案

-回复 -浏览
楼主 2019-07-13 08:53:15
举报 只看此人 收藏本贴 楼主

在前面的博文里,我已经介绍了

大数据躺过的坑之2017年9月份所有微信公众号干货汇总

大数据入门基础系列之MapReduce和YARN运行机制

大数据入门基础系列之MapReduce 数据本地性

大数据入门基础系列之HDFS读取文件和写入文件的原理

大数据入门基础系列之HDFS里的NameNode

大数据入门基础系列之HDFS里的DataNode

大数据入门基础系列之HDFS里的SecondaryNamenode

大数据入门基础系列之HDFS里的Client

大数据入门基础系列之NameNode、DataNode、SecondaryNamenode是如何在磁盘上组织存储持久化数据

大数据入门基础系列之HDFS里的Block

大数据入门基础系列之Hadoop文件的序列化,为什么不用Java的序列化

大数据入门基础系列之Hadoop序列化框架

大数据入门基础系列之Hadoop的RPC机制

看一次笑一次

招募志愿者,共创一流

关于我们

大数据视频干货资料免费分享(100G)更新ing

大数据入门基础系列之Hadoop的文件系统

听妈妈的话

都说高手在民间,一点都没错啊

程序员的饭后娱乐走一走

城市的空,回忆的痛

一个人在外很多年了,孤单的时候,最想谁。

大数据入门基础系列之Hadoop版本介绍

大数据入门基础系列之Hadoop 安装模式

大数据入门基础系列之Hadoop数据压缩

大数据入门基础系列之HDFS的升级机制和回滚机制

大数据入门基础系列之HDFS的数据一致性、文件系统的一致性模型

大数据入门基础系列之HDFS的数据完整性、校验和、数据恢复策略

大数据入门基础系列之MapReduce的map槽和reduce槽、YARN不再区分map槽或reduce槽

大数据入门基础系列之细谈YARN、YARN产生的背景、YARN运行机制、YARN架构、YARN工作流程、YARN HA

大数据入门基础系列之细谈MapReduce中的环形缓冲区

大数据入门基础系列之初谈MapReduce的Shuffle过程(非常重要)

大数据入门基础系列之深谈MapReduce运行机制和执行过程、Map端的shuffle、Reducer端的shuffle剖析

大数据入门基础系列之Hadoop2.X的新特性:HA、Federation、快照

大数据入门基础系列之Hadoop框架怎么来优化

大数据入门基础系列之Hadoop的常用调度器(先进先出调度器、公平调度器、容量调度器、自定义调度器)

原创 | 大数据入门基础系列之链接MapReduce作业(迭代式 、依赖关系式 、线性链式)

大数据入门基础系列之小文件优化






数据分布

        正常的数据分布理论上都是倾斜的,就是我们所说的20-80原理:80%的财富集中在20%的人手中, 80%的用户只使用20%的功能 , 20%的用户贡献了80%的访问量 。







 数据倾斜

        数据倾斜是数据中的常见情况。数据中不可避免地会出现离群值(outlier),并导致数据倾斜。这些离群值会显著地拖慢MapReduce的执行。

        map /reduce 程序执行时, reduce 节点大部分执行完毕,但是有一个或者几个reduce 节点运行很慢,导致整个程序的处理时间很长,这是因为某一个 key 的条数比其他key 多很多(有时是百倍或者千倍之多),这条 key 所在的 reduce 节点所处理的数据量比其他节点就大很多,从而导致某几个节点迟迟运行不完,此称之为数据倾斜

常见的数据倾斜有以下几类:

        (1)数据频率倾斜 ——  某一个区域的数据量要远远大于其他区域。

        (2)数据大小倾斜  ——  部分记录的大小远远大于平均值。

        在map端和reduce端都有可能发生数据倾斜。

        在map端的数据倾斜会让多样化的数据集的处理效率更低。

        在reduce端的数据倾斜常常来源于MapReduce的默认分区器。

        数据倾斜会导致map和reduce的任务执行时间大为延长,也会让需要缓存数据集的操作消耗更多的内存资源。






数据倾斜产生的原因

        Mapreduce程序在运行的时候,运行了大部分,但是还有部分reduce还在运行,甚至长时间运行,最终导致整个程序运行时间很长才结束

        造成这种现象的主要原因是:

        reduce程序处理的key的条数比其他key的条数大很多,这也就造成了分配到数据巨大的key的节点长时间运行。本质讲数据倾斜就是数据分布不均。











数据倾斜出现的场景

        不同的数据字段可能的数据倾斜一般有两种情况:

(1)是唯一值非常少,极少数值有非常多的记录值(唯一值少于几千)。

(2)是唯一值比较多,这个字段的某些值有远远多于其他值的记录数,但是它的占比也小于百分之一或千分之一。






数据倾斜的解决方案 (不同场景)

        方式1:增加reduce 的jvm内存

        既然reduce 本身的计算需要以合适的内存作为支持,在硬件环境容许的情况下,增加reduce 的内存大小显然有改善数据倾斜的可能。

    这种方式尤其适合数据分布第一种情况,单个值有大量记录, 这种值的所有纪录已经超过了分配给reduce 的内存,无论你怎么样分区这种情况都不会改变。

        方式2:增加reduce 个数

        这个对于数据分布第二种情况有效,唯一值较多,单个唯一值的记录数不会超过分配给reduce 的内存. 如果发生了偶尔的数据倾斜情况,增加reduce 个数可以缓解偶然情况下的某些reduce 不小心分配了多个较多记录数的情况. 但是对于第一种数据分布无效。

        方式3: 自定义partition

        如果map输出键的单词来源于一本书。其中大部分必然是省略词(stopword: a,the,or )。那么就可以将自定义分区将这部分省略词发送给固定的一部分reduce实例。而将其他的都发送给剩余的reduce实例。

        比如,这里提供一种解决方法。自己实现partition类,用 key和value相加取hash值。



   或者


        方式4:设定combiner

            减少流向reduce的文件数量,从而减轻reduce数据倾斜。


      


    问:如果问及说hadoop框架怎么来优化?

    答:则可以从hdfs怎么来优化、mapreduce程序怎么来优化,yarn的job调度怎么来优化、hbase怎么来优化、hive怎么来优化等角度来回答。


        具体,见

大数据入门基础系列之Hadoop框架怎么来优化



        



同时,大家可以关注我的个人博客

   http://www.cnblogs.com/zlslch/   和  http://www.cnblogs.com/lchzls/ 



       以及对应本平台的QQ群:161156071(大数据躺过的坑)






        本文版权归大数据躺过的坑)作者和微信公众平台共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。 如果您认为这篇文章还不错或者有所收获,您可以通过下边的“打赏”功能 打赏我一杯咖啡【物质支持】,也可以点击右下角的【点赞】按钮【精神支持】,因为这两种支持都是我继续写作,分享的最大动力!

我要推荐
转发到