Hive 优化
好多优化要基于底层
Hadoop—JVM
把HiveSQL 当做Mapreduce程序去优化
Fetch
hive-default.xml.template hive.fetch.task.conversion →
默认more 如果 none那么每次执行select * from 都是执行MapReduce
本地模式
hive.exec.mode.local.auto=true
并行执行
set hive.exec.parallel=true; //打开任务并行执行
set hive.exec.parallel.thread.number=16; //同一个sql允许最大并行度
严格模式
- 防止用户执行低效率的SQL查询
- 对于分区表,除非where语句中含有分区字段过滤条件来限制范围,否则不允许执行
- 对于使用了order by语句的查询,要求必须使用limit语句
- 限制笛卡尔积的查询。
JVM重用
难避免小文件的场景或task特别多的场景,这类场景大多数执行时间都很短
表的优化(小表与大表)
- Hive默认第一个(左面的)表是小表,然后将其存放到内存中,然后去与第二张表进行比较
- 现在优化后小表前后无所谓
表的优化(大表与大表)
针对于空值,可以将空值随机设置一个不影响结果的值
将来reduce的时候可以分区到不同的reduce,减少压力
mapside聚合
- 分两次进行mapredue,第一次随机分获取中间结果
- 第二次正常分,获取最终结果
Count(Distinct)
- 防止所有的数据都分到一个Reduce上面
- 首先使用Group By对数据进行分组,然后在统计
防止笛卡尔积
当表关联的时候,优先使用子查询对表的数据进行过滤
这样前面表关联数据就是少的,减少关联的次数
https://tech.meituan.com/2014/02/12/hive-sql-to-mapreduce.html