投资网站网站源码,西安的电子商城网站建设,手机视频网站搭建,怎么注册一家公司测试所用到的数据参考#xff1a;
原文链接#xff1a;https://blog.csdn.net/m0_52606060/article/details/135080511 本教程的计算环境为Hive on MR。计算资源的调整主要包括Yarn和MR。
数据倾斜概述
数据倾斜问题#xff0c;通常是指参与计算的数据分布不均#xff0…测试所用到的数据参考
原文链接https://blog.csdn.net/m0_52606060/article/details/135080511 本教程的计算环境为Hive on MR。计算资源的调整主要包括Yarn和MR。
数据倾斜概述
数据倾斜问题通常是指参与计算的数据分布不均即某个key或者某些key的数据量远超其他key导致在shuffle阶段大量相同key的数据被发往同一个Reduce进而导致该Reduce所需的时间远超其他Reduce成为整个任务的瓶颈。
Hive中的数据倾斜常出现在分组聚合和join操作的场景中
分组聚合导致的数据倾斜
优化说明
前文提到过Hive中未经优化的分组聚合是通过一个MapReduce Job实现的。Map端负责读取数据并按照分组字段分区通过Shuffle将数据发往Reduce端各组数据在Reduce端完成最终的聚合运算。 如果group by分组字段的值分布不均就可能导致大量相同的key进入同一Reduce从而导致数据倾斜问题。
由分组聚合导致的数据倾斜问题有以下两种解决思路
1Map-Side聚合
开启Map-Side聚合后数据会现在Map端完成部分聚合工作。这样一来即便原始数据是倾斜的经过Map端的初步聚合后发往Reduce的数据也就不再倾斜了。最佳状态下Map-端聚合能完全屏蔽数据倾斜问题。 相关参数如下 –启用map-side聚合
set hive.map.aggrtrue;–用于检测源表数据是否适合进行map-side聚合。检测的方法是先对若干条数据进行map-side聚合若聚合后的条数和聚合前的条数比值小于该值则认为该表适合进行map-side聚合否则认为该表数据不适合进行map-side聚合后续数据便不再进行map-side聚合。
set hive.map.aggr.hash.min.reduction0.5;–用于检测源表是否适合map-side聚合的条数。
set hive.groupby.mapaggr.checkinterval100000;–map-side聚合所用的hash table占用map task堆内存的最大比例若超出该值则会对hash table进行一次flush。
set hive.map.aggr.hash.force.flush.memory.threshold0.9;2Skew-GroupBy优化
Skew-GroupBy的原理是启动两个MR任务第一个MR按照随机数分区将数据分散发送到Reduce完成部分聚合第二个MR按照分组字段分区完成最终聚合。 相关参数如下 –启用分组聚合数据倾斜优化
set hive.groupby.skewindatatrue;优化案例
1示例SQL语句
selectprovince_id,count(*)
from order_detail
group by province_id;2优化前 该表数据中的province_id字段是存在倾斜的若不经过优化通过观察任务的执行过程是能够看出数据倾斜现象的。 需要注意的是hive中的map-side聚合是默认开启的若想看到数据倾斜的现象需要先将hive.map.aggr参数设置为false。
3优化思路 通过上述两种思路均可解决数据倾斜的问题。下面分别进行说明 1Map-Side聚合 设置如下参数 –启用map-side聚合
set hive.map.aggrtrue;–关闭skew-groupby
set hive.groupby.skewindatafalse;开启map-side聚合后的执行计划如下图所示
很明显可以看到开启map-side聚合后reduce数据不再倾斜。 2Skew-GroupBy优化 设置如下参数 –启用skew-groupby
set hive.groupby.skewindatatrue;–关闭map-side聚合
set hive.map.aggrfalse;开启Skew-GroupBy优化后可以很明显看到该sql执行在yarn上启动了两个mr任务第一个mr打散数据第二个mr按照打散后的数据进行分组聚合。
Join导致的数据倾斜
优化说明
前文提到过未经优化的join操作默认是使用common join算法也就是通过一个MapReduce Job完成计算。Map端负责读取join操作所需表的数据并按照关联字段进行分区通过Shuffle将其发送到Reduce端相同key的数据在Reduce端完成最终的Join操作。 如果关联字段的值分布不均就可能导致大量相同的key进入同一Reduce从而导致数据倾斜问题。 由join导致的数据倾斜问题有如下三种解决方案
1map join
使用map join算法join操作仅在map端就能完成没有shuffle操作没有reduce阶段自然不会产生reduce端的数据倾斜。该方案适用于大表join小表时发生数据倾斜的场景。 相关参数如下 –启动Map Join自动转换
set hive.auto.convert.jointrue;–一个Common Join operator转为Map Join operator的判断条件,若该Common Join相关的表中,存在n-1张表的大小总和该值,则生成一个Map Join计划,此时可能存在多种n-1张表的组合均满足该条件,则hive会为每种满足条件的组合均生成一个Map Join计划,同时还会保留原有的Common Join计划作为后备(back up)计划,实际运行时,优先执行Map Join计划若不能执行成功则启动Common Join后备计划。
set hive.mapjoin.smalltable.filesize250000;–开启无条件转Map Join
set hive.auto.convert.join.noconditionaltasktrue;–无条件转Map Join时的小表之和阈值,若一个Common Join operator相关的表中存在n-1张表的大小总和该值,此时hive便不会再为每种n-1张表的组合均生成Map Join计划,同时也不会保留Common Join作为后备计划。而是只生成一个最优的Map Join计划。
set hive.auto.convert.join.noconditionaltask.size10000000;2skew join
skew join的原理是为倾斜的大key单独启动一个map join任务进行计算其余key进行正常的common join。原理图如下
相关参数如下 –启用skew join优化
set hive.optimize.skewjointrue;–触发skew join的阈值若某个key的行数超过该参数值则触发
set hive.skewjoin.key100000;这种方案对参与join的源表大小没有要求但是对两表中倾斜的key的数据量有要求要求一张表中的倾斜key的数据量比较小方便走mapjoin。 (3调整SQL语句 若参与join的两表均为大表其中一张表的数据是倾斜的此时也可通过以下方式对SQL语句进行相应的调整。 假设原始SQL语句如下AB两表均为大表且其中一张表的数据是倾斜的。
select*
from A
join B
on A.idB.id;其join过程如下
图中1001为倾斜的大key可以看到其被发往了同一个Reduce进行处理。 调整SQL语句如下
select*
from(select --打散操作concat(id,_,cast(rand()*2 as int)) id,valuefrom A
)ta
join(select --扩容操作concat(id,_,0) id,valuefrom Bunion allselectconcat(id,_,1) id,valuefrom B
)tb
on ta.idtb.id;调整之后的SQL语句执行计划如下图所示
优化案例
(1示例SQL语句
select*
from order_detail od
join province_info pi
on od.province_idpi.id;(2优化前 order_detail表中的province_id字段是存在倾斜的若不经过优化通过观察任务的执行过程是能够看出数据倾斜现象的。 需要注意的是hive中的map join自动转换是默认开启的若想看到数据倾斜的现象需要先将hive.auto.convert.join参数设置为false。 3优化思路 上述两种优化思路均可解决该数据倾斜问题下面分别进行说明 1map join 设置如下参数 –启用map join
set hive.auto.convert.jointrue;–关闭skew join
set hive.optimize.skewjoinfalse;可以很明显看到开启map join以后mr任务只有map阶段没有reduce阶段自然也就不会有数据倾斜发生。执行计划里面有MapJoin 2skew join 设置如下参数 –启动skew join
set hive.optimize.skewjointrue;–关闭map join
set hive.auto.convert.joinfalse;–增加map端容器内存
set mapreduce.map.memory.mb2048;开启skew join后使用explain可以很明显看到执行计划如下图所示说明skew join生效任务既有common join又有部分key走了map join。 并且该sql在yarn上最终启动了两个mr任务而且第二个任务只有map没有reduce阶段说明第二个任务是对倾斜的key进行了map join。