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

Hadoop计算框架的特性:

  • 不怕数据大,怕数据倾斜;
  • job数比较多的作业运行效率相对比较低,如子查询较多;
  • 不会发生数据倾斜的情况:sum,count,max,min

会发生数据倾斜的情况:group by,count(distinct),小表关联大表

MapReduce提供Partitioner接口,它的作用就是根据key或value及reduce的数量来决定当前的这对输出数据最终应该交由哪个reduce task处理。默认对key hash后再以reduce task数量取模。默认的取模方式只是为了平均reduce的处理能力,如果用户自己对Partitioner有需求,可以订制并设置到job上。

用hadoop程序进行数据关联时,常碰到数据倾斜的情况,这里提供一种解决方法。

自己实现partition类,用key和value相加取hash值:

方式1:

源代码:

public int getPartition(K key, V value,

                          int numReduceTasks) {

    return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;

  }

修改后

public int getPartition(K key, V value,

                          int numReduceTasks) {

    return (((key).hashCode()+value.hashCode()) & Integer.MAX_VALUE) % numReduceTasks;

  }

方式2:

public class HashPartitioner<K, V> extends Partitioner<K, V> {

private int aa= 0;

  /** Use {@link Object#hashCode()} to partition. */

  public int getPartition(K key, V value,

                          int numReduceTasks) {

    return (key.hashCode()+(aa++) & Integer.MAX_VALUE) % numReduceTasks;

  }

优化常用手段:

  • 减少job数(合并MapReduce,用Multi-group by)
  • 设置合理的task数,能有效提升性能
  • 数据量大,慎用count(distinct)
  • 对小文件进行合并

最新文章

  1. MySQL复制和集群
  2. hzwer模拟赛 Hzwer的陨石
  3. 2016 Multi-University Training Contest 1 F.PowMod
  4. [C#基础知识] ReadOnly关键字修饰的变量可以修改,只是不能重新分配
  5. 【原创】Django-ORM基础
  6. Adafruit的树莓派教程第五课:使用控制电缆
  7. 基于DCMTK的DICOM相关程序编写攻略
  8. 海外支付:遍布全球的Paypal
  9. Java线程通信——wait() 和 notify()
  10. Running an etcd cluster on localhost
  11. jquery mobile selectmenu下拉菜单
  12. Spring 中,对象销毁前执行某些处理的方法
  13. Python实现正则表达式匹配任意的邮箱
  14. 从TensorFlow到PyTorch:九大深度学习框架哪款最适合你?
  15. [How to]HBase集群备份方法--Replication机制
  16. PHP扩展类ZipArchive实现压缩解压Zip文件和文件打包下载
  17. Unity中sharedMaterials 和 materials
  18. webpack+express实现“热更新”和“热加载”(webpack3.6以前的做法)
  19. 7-qt随机数qrand
  20. Vue 安装环境创建项目

热门文章

  1. [codeforces#592Div2]C-G题
  2. queue的常见用法
  3. py3.7安装Scrapy及安装时的 Running setup.py install for Twisted ... error 和安装后的 Unhandled error in Deferred:
  4. 出大问题!webpack 多入口&amp;&amp;html模板在后端
  5. 【二】Django 视图和url配置
  6. xampp配置多域名
  7. iOS崩溃分析
  8. 2019-11-29-dotnet-core-使用-CoreRT-将程序编译为-Native-程序
  9. jenkins复选框插件Extended Choice Parameter plugin
  10. Java注解Annotation与自定义注解详解