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