hive的优化,
一:hadoop框架的特征:
1,不怕数据量大,就怕数据倾斜
2,Jobs 数比较多的作业运行效率相对比较低,如子查询比较多
3,sum,count,max,min 等聚集函数,通常不会有数据倾斜问题
二:数据倾斜
由于数据分布不均匀,造成数据大量的key的集中到某一台服务器,造成数据热点
三:容易造成数据倾斜的情况
1,group by 不和聚集函数搭配使用的时候
2,count(distinct),在数据量大的情况下,容易数据倾斜,因为 count(distinct)是按 group
by 字段分组,按 distinct 字段去重
3,join操作
四:主要表现:
任务进度长时间维持在 99%或者 100%的附近,查看任务监控页面,发现只有少量 reduce
子任务未完成,因为其处理的数据量和其他的 reduce 差异过大
单一 reduce 处理的记录数和平均记录数相差太大,通常达到好几倍之多,最长时间远大
于平均时长
五:业务场景
1,空值产生的数据倾斜
2,不同数据类型关联产生数据倾斜
3,大小表关联查询
map join 概念:将其中 做 连接 的小 表(全量 数据 )分发到所有 MapTask 端进行 Join ,从
而避免了 reduceTask
六:hive的执行过程
Hive 将 HQL 转换成一组操作符(Operator),比如 GroupByOperator, JoinOperator 等
操作符 Operator 是 Hive 的最小处理单元
每个操作符代表一个 HDFS 操作或者 MapReduce 作业
Hive 通过 ExecMapper 和 ExecReducer 执行 MapReduce 程序,执行模式有本地模式和分
布式两种模式
七:hive的优化策略
1,好的设计模型事半功倍
2, 解决数据倾斜问题
3,减少job数
4, 设置合理的mapreduce的task数
5, 了解的业务的数据分布情况
6, 数据量较大的情况下,慎用 count(distinct),group by 容易产生倾斜问题
7,小文件的合并
8,全局的优化观念
9,如何做笛卡尔积 MapJoin 在子查询中可能出现未知 BUG 这时 MapJoin 才是最好的解决办法 扩充小表
10,怎样写 in/exists 语句 用left semi join
11,设置合理的 maptask 个数
12,小文件合并
13, 设置合理的 reduceTask 的 数量 依据 Hadoop 的经验,可以将参数 2 设定为 0.95*( 集群中 datanode 个数)
14, 合理利用分区:Partition
15, 合理利用分桶:Bucketing 和 和 Sampling
16,Join 优化
总体原则:
1、 优先过滤后再进行 Join 操作,最大限度的减少参与 join 的数据量
2、 小表 join 大表,最好启动 mapjoin
3、 Join on 的条件相同的话,最好放入同一个 job,并且 join 表的排列顺序从小到大
17,Group By 优化 可以在map端做聚合
18,合理利用文件存储格式
19,job并行化处理
20 ,合理利用压缩格式