hive-数据倾斜解决详解

标签: hive 数据 | 发表时间:2016-04-11 11:11 | 作者:
出处:http://www.iteye.com

hive在跑数据时经常会出现数据倾斜的情况,使的作业经常reduce完成在99%后一直卡住,最后的1%花了几个小时都没跑完,这种情况就很可能是数据倾斜的原因,解决方法要根据具体情况来选择具体的方案

 

1、join的key值发生倾斜,key值包含很多空值或是异常值

这种情况可以对异常值赋一个随机值来分散key

如:

select userid ,name 

from user_info a

join (

     select  case  when userid  is  null  then  cast ( rand (47 )*100000  as i nt )

     else userid

     from user_read_log

) b  on a .userid  = b .userid

 

通过rand函数将为null的值分散到不同的值上,在key值比较就能解决数据倾斜的问题

 

注:对于异常值如果不需要的话,最好是提前过滤掉,这样计算量可以大大减少

 

2、当key值都是有效值时,解决办法为设置以下几个参数

 

set hive.exec.reducers.bytes.per.reducer = 1000000000

也就是每个节点的reduce 默认是处理1G大小的数据,如果你的join 操作也产生了数据倾斜,那么你可以在hive 中设定

set hive.optimize.skewjoin = true; 
set hive.skewjoin.key = skew_key_threshold (default = 100000)

hive 在运行的时候没有办法判断哪个key 会产生多大的倾斜,所以使用这个参数控制倾斜的阈值,如果超过这个值,新的值会发送给那些还没有达到的reduce, 一般可以设置成你

(处理的总记录数/reduce个数)的2-4倍都可以接受.

 

倾斜是经常会存在的,一般select 的层数超过2层,翻译成执行计划多于3个以上的mapreduce job 都很容易产生倾斜,建议每次运行比较复杂的sql 之前都可以设一下这个参数. 如果你不知道设置多少,可以就按官方默认的1个reduce 只处理1G 的算法,那么  skew_key_threshold  = 1G/平均行长. 或者默认直接设成250000000 (差不多算平均行长4个字节)

 

3、reduce数太少

set mapred.reduce.tasks=800;

 

默认是先设置hive.exec.reducers.bytes.per.reducer这个参数,设置了后hive会自动计算reduce的个数,因此两个参数一般不同时使用

 

4、对于group by 产生倾斜的问题

 

set hive.map.aggr=true (开启map端combiner); //在Map端做combiner,假如map各条数据基本上不一样, 聚合没什么意义,做combiner反而画蛇添足,hive里也考虑的比较周到通过参数hive.groupby.mapaggr.checkinterval = 100000 (默认)

hive.map.aggr.hash.min.reduction=0.5(默认)

两个参数的意思是:预先取100000条数据聚合,如果聚合后的条数/100000>0.5,则不再聚合

 

set hive.groupby.skewindata=true;// 决定  group  by  操作是否支持倾斜的数据。注意:只能对单个字段聚合.控制生成两个MR Job,第一个MR Job Map的输出结果随机分配到reduce做次预汇总,减少某些key值条数过多某些key条数过小造成的数据倾斜问题

 

 

5、小表与大表关联

此时,可以通过mapjoin来优化,

 

set  hive.auto. convert . join  true  ; //将小表刷入内存中  

set  hive.mapjoin.smalltable.filesize = 2500000 ;//刷入内存表的大小(字节)  

 

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [hive 数据] 推荐:

同步mysql数据到hive

- - ITeye博客
地址为:http://archive.cloudera.com/cdh/3/下载相应版本,如sqoop-1.2.0-CDH3B4.tar.gz. 地址为:http://archive.cloudera.com/cdh/3/,版本可以为hadoop-0.20.2-CDH3B4.tar.gz. 3.解压 sqoop-1.2.0-CDH3B4.tar.gz ,hadoop-0.20.2-CDH3B4.tar.gz 到某目录如/home/hadoop/,解压后的目录为.

从hbase(hive)将数据导出到mysql

- - CSDN博客云计算推荐文章
在上一篇文章《 用sqoop进行mysql和hdfs系统间的数据互导》中,提到sqoop可以让RDBMS和HDFS之间互导数据,并且也支持从mysql中导入到HBase,但从HBase直接导入mysql则不是直接支持,而是间接支持. 要么将HBase导出到HDFS平面文件,要么将其导出到Hive中,再导出到mysql.

深入学习《Programing Hive》:数据压缩

- - 互联网 - ITeye博客
Hive使用的是Hadoop的文件系统和文件格式,比如TEXTFILE,SEQUENCEFILE等.          在Hive中对中间数据或最终数据数据做压缩,是提高数据吞吐量和性能的一种手段. 对数据做压缩,可以大量减少磁盘的存储空间,比如基于文本的数据文件, 可以将文件压缩40%或更多,同时压缩后的文件在磁盘间传输和I/O也会大大减少;当然压缩和解压缩也会带来额外的CPU开销,但是却可以节省更多的I /O和使用更少的内存开销.

hive-2 数据加载方式

- - 互联网 - ITeye博客
1 hive数据加载方式:. b) 用查询语句向表中插入数据. a) 使用LOAD DATA方式加载数据详解:. LOAD DATA 【LOCAL】 INPATH ‘....’ 【OVERWRITE】 INTO TABLE t1 【PARTITION (...)】 eg: load data local inpath '/usr/local/data/user' into table jiuye partition(grade='1');.

[转][转]使用 Hive 构建数据库

- - heiyeluren的blog(黑夜路人的开源世界)
当您需要处理大量数据时,存储它们是一个不错的选择. 令人难以置信的发现或未来预测不会来自未使用的数据. 用 Java™ 编程语言编写复杂的 MapReduce 程序要耗费很多时间、良好的资源和专业知识,这正是大部分企业所不具备的. 这也是在 Hadoop 上使用诸如 Hive 之类的工具构建数据库会成为一个功能强大的解决方案的原因.

【转载】Hive 数据倾斜总结

- - SQL - 编程语言 - ITeye博客
转载:http://www.tbdata.org/archives/2109. 几个比较特殊的点都提到了,大家可以作为参考. 在做Shuffle阶段的优化过程中,遇到了数据倾斜的问题,造成了对一些情况下优化效果不明显. 主要是因为在Job完成后的所得到的Counters是整个Job的总和,优化是基于这些Counters得出的平均值,而由于数据倾斜的原因造成map处理数据量的差异过大,使得这些平均值能代表的价值降低.

Hive几种导出数据方式

- - 编程语言 - ITeye博客
如果数据文件恰好是用户需要的格式,那么只需要拷贝文件或文件夹就可以. --不能使用insert into local directory来导出数据,会报错. --只能使用insert overwrite local directory来导出数据. --hive0.11版本之前,只能使用默认分隔符^A(ascii码是\00001).

hive-数据倾斜解决详解

- - ITeye博客
hive在跑数据时经常会出现数据倾斜的情况,使的作业经常reduce完成在99%后一直卡住,最后的1%花了几个小时都没跑完,这种情况就很可能是数据倾斜的原因,解决方法要根据具体情况来选择具体的方案. 1、join的key值发生倾斜,key值包含很多空值或是异常值. 这种情况可以对异常值赋一个随机值来分散key.

Sqoop导入关系数据库到Hive

- - 开源软件 - ITeye博客
文章来自:http://blog.javachen.com/2014/08/04/import-data-to-hive-with-sqoop/. Sqoop 是 apache 下用于 RDBMS 和 HDFS 互相导数据的工具. 本文以 mysql 数据库为例,实现关系数据库导入到 hdfs 和 hive.

Sqoop实现关系型数据库到hive的数据传输

- - CSDN博客互联网推荐文章
Sqoop实现关系型数据库到hive的数据传输. 作者:zyuc_wangxw 发表于2013-8-9 17:21:20 原文链接. 阅读:118 评论:0 查看评论.