数据倾斜:就是大量的相同key被partition分配到一个分区里,map /reduce程序执行时,reduce节点大部分执行完毕,但是有一个或者几个reduce节点运行很慢,导致整个程序的处理时间很长,

这是因为某一个key的条数比其他key多很多(有时是百倍或者千倍之多),这条key所在的reduce节点所处理的数据量比其他节点就大很多,从而导致某几个节点迟迟运行不完。

解决方案:

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速率),推荐使用这种方法。

最新文章

  1. Django之Form、CSRF、cookie和session
  2. Java检测对象是否相等
  3. ASP.NET mvc异常处理的方法
  4. 迷你版Deferred
  5. CEF 相关资料
  6. 双系统Ubuntu无法访问windows磁盘分区解决方法
  7. 洛谷P1251 餐巾(网络流)
  8. SQLite数据库中获取新插入数据的自增长ID
  9. css图片磨砂化
  10. 如何把UIView转成UIImage,解决模糊失真问题
  11. VC中使用GetModuleFileName获取应用程序路径
  12. MongoDB学习笔记~地图坐标的支持与附近点的查找
  13. android中Imageview的布局和使用
  14. git远程管理
  15. 剖析Elasticsearch集群系列之二:分布式的三个C、translog和Lucene段
  16. 在window主机上访问virtualbox虚拟机上centos7的tomcat服务
  17. 9款赏心悦目的HTML5/CSS3应用特效
  18. HDU 3973 AC's String 字符串哈希
  19. SQL面试题(网络收集)
  20. JDK,JRE,JVM之间的关系

热门文章

  1. MAVEN本地下载、安装
  2. CRUD全栈式编程架构之数据层的设计
  3. JavaMail简单应用
  4. Poj 1961 KMP
  5. 腾讯2016校招编程题【PHP实现】
  6. doppia代码结构
  7. SpringMVC学习记录二——非注解和注解的处理器映射器和适配器
  8. 【luogu P2661 信息传递】 题解
  9. Java基础——数据结构总结
  10. 框架篇 -- Struts2