你好,游客 登录
背景:
阅读新闻

什么是数据倾斜?如何解决数据倾斜?

[日期:2018-02-27] 来源:网络大数据  作者: [字体: ]

  导读

  相信很多接触MapReduce的朋友对'数据倾斜'这四个字并不陌生,那么究竟什么是数据倾斜?又该怎样解决这种该死的情况呢?

大数据

  何为数据倾斜?

  在弄清什么是数据倾斜之前,我想让大家看看数据分布的概念:

  正常的数据分布理论上都是倾斜的,就是我们所说的20-80原理:80%的财富集中在20%的人手中, 80%的用户只使用20%的功能 , 20%的用户贡献了80%的访问量 , 不同的数据字段可能的数据倾斜 般有两种情况:

   种是唯 值非常少,好少数值有非常多的记录值(唯 值少于几千)

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

  数据倾斜:

  数据倾斜在MapReduce编程模型中十分常见,用较通俗易懂的话来说,数据倾斜无非就是大量的相同key被partition分配到 个分区里,造成了' 个人累死,其他人闲死'的情况,这种情况是我们不能接受的,这也违背了并行计算的初衷,先 个节点要承受着巨大的压力,而其他节点计算完毕后要 直等待这个忙碌的节点,也拖累了整体的计算时间,可以说效率是十分低下的。

  解决方案:

  1.增加jvm内存,这适用于第 种情况(唯 值非常少,好少数值有非常多的记录值(唯 值少于几千)),这种情况下,往往只能通过硬件的手段来进行调优,增加jvm内存可以显著的提高运行效率。

  2.增加reduce的个数,这适用于种情况(唯 值比较多,这个字段的某些值有远远多于其他值的记录数,但是它的占比也小于百分之 或千分之 ),我们知道,这种情况下,较容易造成的结果就是大量相同key被partition到 个分区,从而 个reduce执行了大量的工作,而如果我们增加了reduce的个数,这种情况相对来说会减轻很多,毕竟计算的节点多了,就算工作量还是不均匀的,那也要小很多。

  3.自定义分区,这需要用户自己继承partition类,指定分区策略,这种方式效果比较显著。

  4.重新设计key,有 种方案是在map阶段时给key加上 个随机数,有了随机数的key就不会被大量的分配到同 节点(小几率),待到reduce后再把随机数去掉即可。

  5.使用combinner合并,combinner是在map阶段,reduce之前的 个中间阶段,在这个阶段可以选择性的把大量的相同key数据先进行 个合并,可以看做是local reduce,然后再交给reduce来处理,这样做的好处很多,即减轻了map端向reduce端发送的数据量(减轻了网络带宽),也减轻了map端和reduce端中间的shuffle阶段的数据拉取数量(本地化磁盘IO速率),推荐使用这种方法。





收藏 推荐 打印 | 录入:Cstor | 阅读:
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数
点评:
       
评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款