赞
踩
区分是join连接导致还是group by分组导致,可以通过查看Yarn(运行过程中) 或者 jobhistory(已经结束的程序)
Map Join:默认开启 比较耗内存,仅适用于小表(23.84m以下)join大表
Bucket Map Join:默认关闭,使用条件是分桶表,且数量是倍数关系
SMB Join :(sorted merge bucket)使用条件是分桶表,且桶数量必须一致,插入数据的时候要排序.
注意:两表连接首先考虑使用条件过滤,过滤后再通过Map Join,Bucket Map Join,SMB Join来解决数据倾斜, 但是这种操作是存在使用条件的, 不满足条件无法使用.
事实表 + 低基数的维度表 进行关联: Map Join 优化
事实表 + 高基数的维度表 进行关联: Bucket Map Join 优化
事实表 + 事实表 进行关联: SMB Join 优化(相对使用最少, 因为条件过于苛刻, 而且对资源消耗过大, 如果资源不够, 运行效率低于原始Join方案)
将产生数据倾斜的key和对应的v2数据从当前mr程序中移出,单独找一个mr进行处理,处理后再与原来的union all.
1.运营期处理方案(全自动)
开启运行期处理倾斜的参数,并调整一个合理的阈值,交由系统来动态监测.适用于:不清楚哪个key值易倾斜时.
2.编译器处理方案(半自动)
建表时预计会产生倾斜的key值,在建表时提前配置好让后续程序运行时自动找一个mr程序处理,处理后再与原来的union all.
注意:union all也是单独运行一个mr程序,默认是各个MR将结果输出 临时目录 ,再通过 union all 合并到最终目的地,开启set hive.optimize.union.remove=true让每一个MR在运行完成后,直接将结果输出到目的地即可.
每个MR的combiner(规约)内部提前聚合,再到达reduce阶段进行汇总合并得出结果,从而减轻数据倾斜问题.默认开启!!!
针对大combiner采用负载均衡,需要运行两个mr程序时手动开启负载均衡设置(set hive.groupby.skewindata=true),在map任务完成后采用随机分发的方式,保证后面的每一个reduce拿到相等数量的数据信息更彻底解决数据倾斜问题,同时减轻数据倾斜的压力.
建议在生产中, 优先使用第一种, 如果第一种无法解决, 尝试使用第二种解决.
注意事项:使用负载均衡的解决group by的数据倾斜问题时,一定要注意SQL语句中不能出现多次distinct操作, 否则 HIVE直接报错
错误信息:
Error in semantic analysis: DISTINCT on different columns not supported with skew in data.
比如说:
SELECT ip, count(DISTINCT uid), count(DISTINCT uname) FROMlog GROUP BY ip 此操作就直接报错了,只能使用方案一解决数据倾斜.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。