Hive本质
Hive的本质其实就是 Hdfs+MapReduce,HDFS存储、MR执行任务
发生数据倾斜的原因
1.数据本身倾斜
内容倾斜、group by倾斜、小表Join大表
2.过多
Join过多导致Job过多、小文件过多、Mapper或Reducer过多
3.SQL语句使用问题
count(distinct)->全盘扫描
join ... where 笛卡尔乘积
关于数据倾斜见我的博客:
大数据常见问题:数据倾斜的原理及处理方案_AriesLY0411的博客-优快云博客
解决方案
模型设计
整体最优,考虑全局
合理减少表数量
sqoop:query "select ... join ..."
#数据清洗
ods -> dwd insert into ... select ... join ...
选择合适的数据建模
星型(优先考虑)、雪花、星座
维度表(静态数据)、事实表(动态数据:谁在什么时间做了什么事情)
维度退化(降维)=> 星型
充分了解业务,提前设计好预聚合
分层 => 轻量聚合
基于主题,时间维度表、用户画像、产品三级分类...
分区 => 避免交换
拉链表
压缩 => 减少体量
配置压缩,工作场景优先LZO
热点数据:内置自动优化
join:非大小表
#默认Join键对应的记录数超过该值则进行倾斜分析
set hive.skewjoin.key=100000;
#默认false,如果Join键倾斜则设为true
set hive.optimize.skewjoin=true
#默认10000,倾斜处理mapper数量上限
set hive.skewjoin.mapjoin.map.tasks=10000;
#默认32M,倾斜最小切片大小
set hive.skewjoin.mapjoin.min.split=32M
map join : 大小表
#默认true
set hive.auto.