赞
踩
数据倾斜主要指:每个reduce拿到的数据量并不均衡。如何发现:查看每一个reduceTask执行时间,大部分的reduceTask都执行完成了, 只有其中一个或者几个没有执行完成, 此时认为发生了数据倾斜
通过 map join,bucket map join,smb Join 来解决数据倾斜, 但是 这种操作是存在使用条件的, 如果无法满足这些条件, 无法使用 这种处理方案
在执行MR的时候, 会动态统计每一个键的值出现重复的次数, 当这个重复的次数达到一定的阈值后, 认为当前这个键的数据存在数据倾斜, 对于数据倾斜严重的JOIN操作,可以将其拆分为多个步骤进行处理,先处理倾斜的部分,然后与其他正常数据进行合并
方法
set hive.skewjoin.key=100000; 阈值判断
set hive.optimize.skewjoin=true; – 开启运行期处理倾斜参数
数据重分布,使用hive的内置函数(distribute by和cluster by)或自定义函数对参与join的列进行哈希化或者随机化,均匀分部到不同的桶中。
动态调整并行度,可以根据实际情况动态调整join操作的并行度,减少或增加任务数量,平衡数据在各任务之间的负载。
可以使用hive的hive.exec.reducers.bytes.per.reducer属性来调整每个Reducer任务处理的数据量
基于MR的 combiner(规约, 提前聚合) 减少数据达到reduce数量, 从而减轻倾斜问题。让每一个mapTask内部进行提前聚合, 然后到达reduce进行汇总合并得出结构
方法:只需要在HIVE中开启combiner提前聚合配置参数即可:
set hive.map.aggr=true;
负载均衡的解决方案(需要运行两个MR来处理) (大combiner方案)
让第一个MR进行打散并对数据进行聚合计算 得出局部结果, 然后让第二个MR进行最终聚合计算操作, 得出最终结果
发法:只需要开启负载均衡的HIVE参数配置即可 set hive.groupby.skewindata=true;
可以使用Hive的内置函数或自定义函数对参与group by的列进行哈希或随机化,将数据均匀分布到不同的桶中。使用Hive的distribute by语句来指定数据分发方式,以确保数据在不同的Reduce任务之间均匀分布
可以根据实际情况动态调整group by操作的并行度,增加或减少Reduce任务的数量,以平衡数据在各个任务之间的负载。可以使用Hive的hive.exec.reducers.bytes.per.reducer属性来调整每个reduce任务处理的数据量
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。