Hive语法层面优化之六数据倾斜常见案例

常见案例一:空值产生的数据倾斜

日志表有一部分的user_id为空或者是0的情况,导致在用user_id进行hash分桶时,会将日志由user_id为0或者为空的数据分到一个reduce上,导致数据倾斜;

如:访户未登录时,日志中的user_id为空,用user_id和用户表的user_id进行关联的时候,会将日志中的user_id为空的数据分到一起,导致了过大的空key造成数据倾斜;

解决办法:随机函数解决数据倾斜

把空值的key变成一个字符串加上随机数(只要不与真正的end_user_id的格式相同即可),把倾斜的数据分发到不同的reduce上,由于null值关联不上用户表,处理后并不影响最终结果

案例: end_user 5000W数据,维度表; trackinfo 每日2亿,按日增量表;

原写法:

select u.id,  t.url,  t.track_time   from  end_user u
join
(select end_user_id,  url,  track_time   from trackinfo where ds=‘2013-12-01‘) t
on u.id=t.end_user_id limit 2;

注意事项:where条件最好别放在最后,而是放到某个子查询中或者on前,可以事先过滤掉一批数据

调整为:

select u.id, t.url, t.track_time from end_user u
join
(select
  case when end_user_id=‘null‘ or end_user_id is null
  then cast (concat(‘00000000‘,floor(rand()*1000000)) as bigint)
  else end_user_id
end as end_user_id ,
  url,track_time
from trackinfo where ds=‘2013-07-21‘) t
on u.id=t.end_user_id limit 2;

在相同的集群中测试发现:后一种的写法比前一种的写法快差不多2倍;

CASE … WHEN … THEN Statements 案例:

SELECT empno, ename, sal,
CASE
WHEN sal <  1000.0 THEN ‘low‘
WHEN sal >= 1000.0 AND sal <  1500.0 THEN ‘middle‘
WHEN sal >= 1500.0 AND sal < 2000.0 THEN ‘high‘
ELSE ‘very high‘
END AS salary FROM emp;    

7369    SMITH   800.0   low
7499    ALLEN   1600.0  high
7521    WARD    1250.0  middle
7566    JONES   2975.0  very high
7654    MARTIN  1250.0  middle
7698    BLAKE   2850.0  very high
7782    CLARK   2450.0  very high
7788    SCOTT   3000.0  very high
7839    KING    5000.0  very high
7844    TURNER  1500.0  high
7876    ADAMS   1100.0  middle
7900    JAMES   950.0   low
7902    FORD    3000.0  very high
7934    MILLER  1300.0  middle

Hive语法层面优化之六数据倾斜常见案例

时间: 2024-12-12 05:15:12

Hive语法层面优化之六数据倾斜常见案例的相关文章

Hive语法层面优化之一数据倾斜介绍

数据倾斜:数据分布不均匀,造成数据大量的集中到一点,造成数据热点: 由于数据并不是平均分配的,会导致各个节点上处理的数据量是不均衡的,所以数据倾斜是无法避免的: 造成数据倾斜的最根本原因:key分发不均匀造成的: 常见的数据倾斜的症状 1)  Map阶段快,reduce阶段非常慢: 2)  某些map很快,某些map很慢: 3)  某些reduce很快,某些reduce很慢: 4)  任务进度长时间维持在99%(或100%),查看任务监控页面,发现只有少量(1个或几个)reduce子任务未完成,

Hive语法层面优化之七数据倾斜总结

关键字 情形 后果 join 其中一个表较小,但key集中 分发到某一个或几个reduce上的数据远高于平均值 大表与大表关联,但是分桶的判断字段0值或空值过多 这些空值都由一个reduce处理,非常慢 group by Group by维度过小,某值的数量过多 处理某值的reduce非常耗时 count distinct 某特殊值过多 处理此特殊值的reduce耗时 Hive语法层面优化之七数据倾斜总结

Hive语法层面优化之四count(distinct)引起的数据倾斜

当该字段存在大量值为null或空的记录,容易发生数据倾斜: 解决思路: count distinct时,将值为空的情况单独处理,如果是计算count distinct,可以不用处理,直接过滤,在最后结果中加1: 如果还有其他计算,需要进行group by,可以先将值为空的记录单独处理,再和其他计算结果进行union. 案例: select count(distinct end_user_id) as user_num from trackinfo; 调整为: select cast(count(

Hive语法层面优化之五分析执行计划追踪导致数据倾斜的原因

count(distinct key)案例 explain select count(distinct session_id) from trackinfo where ds=' 2013-07-21' ; STAGE DEPENDENCIES: Stage-1 is a root stage Stage-0 is a root stage STAGE PLANS: Stage: Stage-1 Map Reduce Alias -> Map Operator Tree: trackinfo T

Hive架构层面优化之六分布式缓存

案例: Hadoop jar引用:hadoop jar -libjars aa.jar bb.jar …. jar包会被上传到hdfs,然后分发到每个datanode 假设有20个jar文件,每天jar文件被上传上万次,分发达上万次(百G级),造成很严重的IO开销. 如何使这些jar包在HDFS上进行缓存,同一个jar只需上传和分发一次,后续所有的job可以节省此jar的上传和分发的开销,从而减少不必要的上传和分发呢? 解决方案:使用分布式缓存 MapReduce如何使用分布式缓存 Hadoop

hive高级操作(优化,数据倾斜优化)

2019/2/21 星期四 hive高级操作(优化,数据倾斜优化) 分区表/桶表应用,skew,map-join //见hive的基本语法行列转换 hive 优化hive 优化思想Explain 的使用经典案例(distinct count) 数据倾斜的原因操作:关键词 情形 后果1.Join 其中一个表较小,但是key 集中分发到某一个或几个Reduce 上的数据远高于平均值 :2.大表与大表,但是分桶的判断字段0 值或空值过多这些空值都由一个reduce 处理,非常慢:3.group by

Hive参数层面优化之二控制Reduce数

Reduce数决定中间或落地文件数,文件大小和Block大小无关. 1.Reduce个数的决定因素 reduce个数的设定极大影响任务执行效率,不指定reduce个数的情况下,Hive会猜测确定一个reduce个数,基于以下两个设定: 参数1:hive.exec.reducers.bytes.per.reducer(每个reduce任务处理的数据量,默认为1000^3=1G) 参数2:hive.exec.reducers.max(每个作业最大的reduce数,默认为999) 计算reducer数

spark性能优化:数据倾斜调优

调优概述 有的时候,我们可能会遇到大数据计算中一个最棘手的问题--数据倾斜,此时Spark作业的性能会比期望差很多.数据倾斜调优,就是使用各种技术方案解决不同类型的数据倾斜问题,以保证Spark作业的性能. 数据倾斜发生时的现象 1.绝大多数task执行得都非常快,但个别task执行极慢.比如,总共有1000个task,997个task都在1分钟之内执行完了,但是剩余两三个task却要一两个小时.这种情况很常见. 2.原本能够正常执行的Spark作业,某天突然报出OOM(内存溢出)异常,观察异常

Hive架构层面优化之七压缩

常见的压缩有:对中间结果压缩.对输出结果压缩. 压缩对比: 算法 压缩前/压缩后 压缩速度 解压速度 GZIP 13.4% 21MB/s 118 MB/s LZO 20.5% 135 MB/s 410 MB/s Snappy 22.2% 172 MB/s 409 MB/s Snappy介绍: Snappy 网站:http://code.google.com/p/snappy/ Snappy的前身是Zippy.虽然只是一个数据压缩库,它却被Google用于许多内部项目程,其中就包括BigTable