hive调优
1、Fetch抓取,尽量避免hive走mapreduce。如何设置:set hive.fetch.task.conversion=more;
在hive-default.xml.template文件中hive.fetch.task.conversion默认是more,老版本hive默认是minimal,该属性修改为more以后,在全局查找、
字段查找、limit查找等都不走mapreduce。
2、开启本地模式
大多数的Hadoop Job是需要Hadoop提供的完整的可扩展性来处理大数据集的。不过,有时Hive的输入数据量是非常小的。在这种情况下,为查询触发执行任务时消耗可能会比实际job的执行时间要多的多。对于大多数这种情况,Hive可以通过本地模式在单台机器上处理所有的任务。对于小数据集,执行时间可以明显被缩短。
用户可以通过设置hive.exec.mode.local.auto的值为true,来让Hive在适当的时候自动启动这个优化。
set hive.exec.mode.local.auto=true; //开启本地mr
//设置local mr的最大输入数据量,当输入数据量小于这个值时采用local mr的方式,默认为134217728,即128M
set hive.exec.mode.local.auto.inputbytes.max=51234560;
//设置local mr的最大输入文件个数,当输入文件个数小于这个值时采用local mr的方式,默认为4
set hive.exec.mode.local.auto.input.files.max=10;
案例实操:
1)开启本地模式,并执行查询语句
hive (default)> set hive.exec.mode.local.auto=true;
hive (default)> select * from score cluster by s_id;
18 rows selected (1.568 seconds)
2)关闭本地模式,并执行查询语句
hive (default)> set hive.exec.mode.local.auto=false;
hive (default)> select * from score cluster by s_id;
18 rows selected (11.865 seconds)
3、表的优化
1)、小表join大表
尽量用小表join大表,新的版本当中不存在小表join大表,还是大表join小表,因为新的版本当中默认开启了map端的join操作,
会自动优化,不管是大表join小表,还是小表join大表,都会自动的将小表的数据加载到内存当中来
2)、多表关联时,拆分成多个小段,避免大SQL
3)、大表join大表时
尽量避免无效的on条件,一定要避免笛卡尔积
尽量避免空 key 进行空key的过滤或者对空key进行转换
4)、启动map端的join功能
set hive.auto.convert.join=true 默认就是启用了
map端数据join的一个机制:多启动一个mapTask,寻找哪个表当中的数据是小表
设置表的数据的大小为多大是一个小表
set hive.mapjoin.smalltable.filesize=25123456;
4、count(distinct) 尽量转换成group by
5、一定要避免笛卡尔积,确保我们的后面带的条件一定要生效
6、使用分区裁剪,列裁剪 查询的时候,尽量带上分区号,只取相关的字段,无关的字段不要出现在select后面
7、使用动态分区
如果要想使用动态分区:
partition后面的字段不需要自己手动指定了
select里面必须出现分区字段,并且分区字段只能是最后一个出现的
动态分区的字段值不支持中文
INSERT overwrite TABLE ori_partitioned_target PARTITION (p_time)
SELECT id, time, uid, keyword, url_rank, click_num, click_url, p_time
FROM ori_partitioned;
第九个调优:控制map和reduce的个数
控制map的个数减少
set mapred.max.split.size=112345600;
set mapred.min.split.size.per.node=112345600;
set mapred.min.split.size.per.rack=112345600;
set hive.input.format= org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
使用CombineHiveInputFormat来对我们的小文件进行合并,小于100M的文件当做小文件,进行合并到一起
如何控制map的个数增加 可以通过distributed by将我们的文件划到多个小文件里面去,就可以增加mapTask的个数
set mapreduce.job.reduces =10;
create table a_1 as
select * from a
distribute by rand(123);
如何控制reduce的个数
可以手动指定reduce的个数
set mapreduce.job.reduces = 15;
第十个调优:explain查看执行计划
第十一个调优:并行执行 资源比较充足的时候,并行执行才会比较好
select from table
union all
select from table
第十二个调优:hive的严格模式
1:分区表必须带上分区字段
2:order by 必须使用limit限制
3: 笛卡尔积不能执行
第十三个调优:JVM的重用
MapTask执行完成之后,分配的资源不要释放了,留给reduceTask继续使用
会造成一个副作用,就是就算这个mapTask执行完了,没有其他的reducetask来执行了,资源也不会马上释放,得要等到job完成之后再统一释放资源
第十四个调优:关闭推测执行:
一般直接关闭map和reduce的推测执行
第十五个:存储格式和压缩
一般使用 textFile orc
压缩方式: snappy