hive的优化
优化方式:
- 1、环境优化(linux 句柄数、应用内存分配、是否负载等)
- 2、应用配置属性方面的优化。
- 3、代码优化(hql,尝试换一种hql的写法)。
学会看explain:解释执行计划
- explain :显示hql查询的计划。
hive>explain select * from one;
- explain extended :显示hql查询的计划。还会显示hql的抽象表达式树。(就是解释器干得事)
hive>explain extended select * from one;
- 说明一个hql语句将会有一个或者多个stage构成。每一个stage相当于一个mr的job,
stage可以是一个Fetch 、 map join 、 limit 等操作。每一个stage都会按照依赖关系依次执行,没有依赖关系的可以并行执行。一个hive的hql语句包含一个或者是多个stage,多个之间依赖越复杂,表示任务越复杂,执行效率越低。
对limit的优化:
这些是设置对limit的属性,这些可以在hive的hive-default.xml 文件中设置。
- 设置是否默认开启limit优化
set hive.limit.optimize.enable=false//建议开启为true.
- 设置使用limit最多可以查询多少行
set hive.limit.row.max.size=100000
- 设置最多可以操作的文件数
set hive.limit.optimize.limit.file=10
- 设置
对join的优化:
- 永远是小表驱动大表(小结果集驱动大结果集)
- 必要时候使用小表标识 +STREAMTABLE(小表别名)
- 将业务调整为能尽量使用map-side join(开启map端的join)
- 尽量避免笛卡尔积的join查询,即便有咯也需要使用on 或者where 来过滤。
- hive目前的join 只支持等值连接(=)。其它的不行
使用hive本地模式(在一个jvm里面运行)
- hive查询数据依靠的是hadoop
- 是否开启本地模式,建议的是开启本地模式
hive.exec.mode.local.auto=false//true最好
hive.exec.mode.local.auto.inputbytes.max=134217728
hive.exec.mode.local.auto.input.files.max=4
hive并行执行(stage之间没有相互依赖关系的可以并行执行)
- 是否开启并行
hive.exec.parallel=false
- 允许开启的并行数量
hive.exec.parallel.thread.number=8
设置mapper 和 reduce个数
- mapper个数太多,启动耗时,个数太少,资源利用不充分
- reducer个数太多,启动耗时,个数太少,资源利用不充分
- mapper个数:
- 手动设置:
hive>set mapred.map.tasks=n;
- 适当调整块大小,从而改变分片数,来改变mapper个数:
- 通过合并文件小文件来减少mapper个数:
mapred.max.split.size=25600000; 256M mapred.min.split.per.node=1 mapred.min.split.per.rack=1 hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
- reducer个数
- 手动设置:
set mapreduce.job.reduces=-1;
hive使用jvm重用
- 设置一个jvm中允许的task的数量
mapreduce.job.jvm.numtasks=1
- 设置一个jvm中可以重用的task
mapred.job.reuse.jvm.num.tasks=8;
数据倾斜
-
解释:数据某列的值分布不均匀。
-
造成数据倾斜的原因:
- 1、原本数据就倾斜
- 2、hql语句可能造成
- 3、join 极容易造成
- 4、count(distinct col)
- 5、group by语句也容易
-
解决方法:
- 1、如果数据本身倾斜,看数据能否直接分离(找到倾斜的数据)
- 2、将倾斜的数据单独出来计算,然后和正常的数据进行union all
- 3、将倾斜的数据赋予随机数来进行join查询,均衡每个task的任务量。
- 4、试图不变需求改写hql语句。
-
倾斜解决的几个属性设置:
- 设置进行group by的时候是否开启map端的聚合
hive.map.aggr=true
- 时候开启倾斜join的优化,建议是开启
hive.groupby.skewindata=false
- 是否开启有倾斜数据的group by查询的优化
hive.optimize.skewjoin=false
job数量的控制
- 连接查询的on中的连接字段类型尽可能相同。
- 通常是一个简单hql语句生成一个job,有join 、limit 、group by 都将有可能会生成一个独立job。所以尽量避免这些语句的出现。
按需求和合理使用一下的技术:这些本身就是hive的一种优化。
- 合理使用分区
- 合理使用分桶
- 合理使用索引
严格模式:
hive提供的严格模式阻挡三种查询:
- 1、带有分区的表的查询
- 2、带有orderby的查询
- 3、join查询语句,不带on条件 或者 where条件。