何谓数据倾斜?数据倾斜指的是,并行处理的数据集 中,某一部分(如Spark的一个Partition)的数据显著多于其它部分,从而使得该部分的处理速度成为整个数据集处理的瓶颈。

表现为整体任务基本完成,但仍有少量子任务的reduce还在运行。

数据倾斜的原因:

1.join

一个表较小,但key集中,分发到一个或者几个reduce上的数据远高于平均值;

大表与大表关联,但分桶的判断字段0值或者空值过多,这些空值或者0值都由一个reduce处理

2.group by

分组的维度过少,每个维度的值过多,导致处理某值的reduce耗时很久

3.count distinct

特殊值过多,处理特殊值耗时

综上所述原因就是:

key值分布不均,数据本身的原因(特殊值过多),sql语句不合理,表建的不合理

解决数据倾斜的方法:

1.参数配置

hive> set hive.map.aggr=true;  设置map端聚合

hive> set hive.groupby.skewindata=true; 当数据倾斜时,进行负责均衡

2.语句优化

小表与大表join时,使用mapjoin 将小表加载到内存中。

scala> hivecon.sql("select /*MAPJOIN(tbsex)*/  b.custname,b.nianling,a.sexname from tbsex a join  cust b on a.id=b.sex").show
+---------------+--------+-------+                                             
|       custname|nianling|sexname|
+---------------+--------+-------+
|          hello|     100|    man|
|         wangwu|      47|    man|
|         liuqin|      56|    man|
|          hello|     100|    man|
|         wangwu|      47|    man|
|         liuqin|      56|    man|
|          nihao|       5|  woman|
|      mahuateng|    1001|  woman|
|        liuyang|      32|  woman|
|          nihao|       5|  woman|
|       zhangsan|      20|  woman|
|         wangwu|      85|  woman|
|tianyt_touch100|      50|  woman|
|      mahuateng|    1001|  woman|
|        liuyang|      32|  woman|
|       zhangsan|      20|  woman|
|         wangwu|      85|  woman|
|tianyt_touch100|      50|  woman|
+---------------+--------+-------+

如果关联的key存在空值,可以过滤掉空值再进行关联也可以为空值赋一个随机值
scala> hivecon.sql("select  b.custname,b.nianling,a.sexname from tbsex a join  cust b on b.sex is not null and  a.id=b.sex").show
+---------------+--------+-------+
|       custname|nianling|sexname|
+---------------+--------+-------+
|          hello|     100|    man|
|         wangwu|      47|    man|
|         liuqin|      56|    man|
|          hello|     100|    man|
|         wangwu|      47|    man|
|         liuqin|      56|    man|
|          nihao|       5|  woman|
|      mahuateng|    1001|  woman|
|        liuyang|      32|  woman|
|          nihao|       5|  woman|
|       zhangsan|      20|  woman|
|         wangwu|      85|  woman|
|tianyt_touch100|      50|  woman|
|      mahuateng|    1001|  woman|
|        liuyang|      32|  woman|
|       zhangsan|      20|  woman|
|         wangwu|      85|  woman|
|tianyt_touch100|      50|  woman|
+---------------+--------+-------+

把空值的 key 变成一个字符串加上随机数,就能把倾斜的数据分到不同的reduce上 ,解决数据倾斜问题。 concat('hehe',rand())

count distinct 引起的数据倾斜,可以先去重后再进行统计

scala> hivecon.sql("select  sex,count(distinct custname) from cust group by  sex").show
+----+------------------------+                                                
| sex|count(DISTINCT custname)|
+----+------------------------+
|null|                       1|
|   1|                       6|
|   0|                       3|
+----+------------------------+

scala> hivecon.sql("select sex,count(1) from (select  sex,custname from cust group by custname, sex) mm group by sex").show
+----+--------+
| sex|count(1)|
+----+--------+
|null|       1|
|   1|       6|
|   0|       3|
+----+--------+

3.map和reduce优化

小文件过多的时候合并小文件

hive> set hive.merge.mapfiles=true;

单个文件过大可以设置map的个数

hive数据倾斜原因以及解决办法的更多相关文章

  1. Hive 数据倾斜原因及解决方法(转)

    在做Shuffle阶段的优化过程中,遇到了数据倾斜的问题,造成了对一些情况下优化效果不明显.主要是因为在Job完成后的所得到的Counters是整个Job的总和,优化是基于这些Counters得出的平 ...

  2. HBase快照迁移数据失败原因及解决办法

    目录 目录 1 1. 背景 1 2. 环境 1 3. 执行语句 1 4. 问题描述 1 5. 错误信息 2 6. 问题原因 3 7. 解决办法 4 1. 背景 机房裁撤,需将源HBase集群的数据迁移 ...

  3. Spark产生数据倾斜的原因以及解决办法

    Spark数据倾斜 产生原因 首先RDD的逻辑其实时表示一个对象集合.在物理执行期间,RDD会被分为一系列的分区,每个分区都是整个数据集的子集.当spark调度并运行任务的时候,Spark会为每一个分 ...

  4. 实战 | Hive 数据倾斜问题定位排查及解决

    Hive 数据倾斜怎么发现,怎么定位,怎么解决 多数介绍数据倾斜的文章都是以大篇幅的理论为主,并没有给出具体的数据倾斜案例.当工作中遇到了倾斜问题,这些理论很难直接应用,导致我们面对倾斜时还是不知所措 ...

  5. .Net内存泄露原因及解决办法

    .Net内存泄露原因及解决办法 1.    什么是.Net内存泄露 (1).NET 应用程序中的内存 您大概已经知道,.NET 应用程序中要使用多种类型的内存,包括:堆栈.非托管堆和托管堆.这里我们需 ...

  6. HttpClient的CircularRedirectException异常原因及解决办法

    HttpClient的CircularRedirectException异常原因及解决办法 这两天在使用我自己爬虫抓取网页的时候总是出现 org.apache.http.client.ClientPr ...

  7. mysql保存中文乱码的原因和解决办法

    当你遇到这个mysql保存中文乱码问题的时候,期待找到mysql保存中文乱码的原因和解决办法这样一篇能解决问题的文章是多么激动人心.    也许30%的程序员会选择自己百度,结果发现网友已经贴了很多类 ...

  8. html页面顶部出现一段空白,检查控制台发现body 下出现&#65279字符,原因及解决办法

    html页面顶部出现一段空白,检查控制台发现body 下出现&#65279字符,原因及解决办法 分析: 原来是页面编码时增加了BOM,此页面后端数据主要是PHP语言,对PHP来讲PHP在设计时 ...

  9. mysql数据库死锁的产生原因及解决办法

    这篇文章主要介绍了mysql数据库锁的产生原因及解决办法,需要的朋友可以参考下   数据库和操作系统一样,是一个多用户使用的共享资源.当多个用户并发地存取数据 时,在数据库中就会产生多个事务同时存取同 ...

随机推荐

  1. tomcat整体架构

    1.背景 Tomcat作为JavaWeb领域的Web容器,目前在我们淘宝也使用的也非常广泛,现在基本上所有线上业务系统都是部署在Tomcat上.为了对平时开发的Web系统有更深入的理解以及出于好奇心对 ...

  2. 解决Sublime Text 3中文显示乱码问题

    之前用Sublime Text 2,阅读了你是猴子派的救兵吗写的博客解决Sublime Text 2中文显示乱码问题,解决了问题. 后来嫌版本2启动太慢了,换成Sublime Text 3之后,发现网 ...

  3. Osip2和eXosip协议栈的简析

    Osip2是一个开放源代码的sip协议栈,是开源代码中不多使用C语言写的协议栈之一,它具有短小简洁的特点,专注于sip底层解析使得它的效率比较高. eXosip是Osip2的一个扩展协议集,它部分封装 ...

  4. mysql查询优化之三:查询优化器提示(hint)

    目录: <MySQL中的两种临时表>--强制使用临时表 SQL_BUFFER_RESULT <MySQL 多表关联更新及删除> <mysql查询优化之三:查询优化器提示( ...

  5. 使用LiteOrm删除数据对象失败的坑

    使用 LiteOrm.newSingleInstance(BaseApplication.getInstance(), Constant.DB_NAME); 在不同进程中创建了两次对象,在保存和删除的 ...

  6. 第11章 拾遗5:IPv6和IPv4共存技术(2)_ISATAP隧道技术

    6.3 ISATAP隧道技术 (1)基本概念 ①在一个IPv4网络中主机与路由器之间创建一条ISATAP隧道,以便让该主机可以访问IPv6网络中的资源. ②条件:IPv4中的PC主机需要支持IPv4和 ...

  7. gulp 编译es6 react 教程 案例 配置

    1.gulp基本配置: var gulp = require('gulp'), watch = require('gulp-watch'), babel = require('gulp-babel') ...

  8. cocos源码分析--RenderTexture

    cocos中RenderTexture主要用来实现截屏,然后把截取出来的图片保存到磁盘中,除了保存图片和渲染纹理,它还可以得到一些预渲染结果,并将这些结果作为一种纹理数据. 例如我们可以用RGB5_A ...

  9. CS229 6.5 Neurons Networks Implements of Sparse Autoencoder

    sparse autoencoder的一个实例练习,这个例子所要实现的内容大概如下:从给定的很多张自然图片中截取出大小为8*8的小patches图片共10000张,现在需要用sparse autoen ...

  10. 《linux性能及调优指南》 3.4 硬盘瓶颈

    翻译:Hank (http://blog.csdn.net/fireroll)版权所有,尊重他人劳动成果,转载时请注明作者和原始出处及本声明.原文名称:<Linux Performance an ...