hive优化策略:
1.表的优化:数据量大时,可以拆分表,大表拆分为小表,拆分为分区表,外部表。
小表和大表join,把数据量小的表放在join左边,先缓存,减少表join时的内存消耗量
2.数据倾斜:hive.map.aggr=true (默认true) 这个配置项代表是否在map端进行聚合,相当于Combiner
在mapreduce程序中合理设置切片大小 job.setInputFormatClass(CombineTextInputFormat.class);
CombineTextInputFormat.setMinInputSplitSize(job, 2048);
CombineTextInputFormat.setMaxInputSplitSize(job, 4096);
设置reduce个数
根据业务自定义分区规则
3.并行执行:没有依赖性的MR任务,可以使用并行执行,同时间执行多个MR任务,以提高效率
set hive.exec.parallel=true ; // 开启任务并行执行
set hive.exec.parallel.thread.number=8; //默认值为8个任务可以同时运行
4.严格模式:防止一些查询出现不好影响(笛卡尔积等) hive.mapred.mode =strict/nostrict
分区表必须存在where语句;对于orderby必须使用limit以减少reduce处理的数据量
5.jvm重用:每次运行任务就会开启一个jvm,提交任务频繁会频繁开启jvm,浪费资源,对于小文件
可以减少jvm开启次数 mapreduce.job.jvm.numtasks 值代表处理任务的个数,例如10
6.推测执行:默认是开启的,防止任务卡死。开启任务运行5%以上才会开启推测执行
mapreduce.map.speculative
7.fetch抓取:把不需要MR任务计算的查询语句设置成不执行mr任务。
none---------禁用fecth,禁用之后所有查询都会执行mr任务
more---------进行select filter limit 查询时不执行mr任务
minimal------进行select limit查询时不运行mr任务,filter会执行mr任务
8.本地模式:把小文件的处理放在hive本地节点上进行处理。通过判断文件大小,输入文件个数判断
是否在本地执行。文件默认值大小为128M,文件个数默认为4个。
hive.exec.mode.local.auto=true;(默认为false)
当一个job满足如下条件才能真正使用本地模式:
1.job的输入数据大小必须小于参数:hive.exec.mode.local.auto.inputbytes.max(默认128MB)
2.job的map数必须小于参数:hive.exec.mode.local.auto.tasks.max(默认4)
3.job的reduce数必须为0或者1
报错,各种找不到jar包时运行一个语句:set fs.defaultFS=file:///
9.执行计划:把复杂hql语句简单化处理,例如多表join,hql语句前加explain可查看hql语句语法树即执行计划