关于hive数据仓库的调优方式有很多种,留篇博客用来方便记忆...
1、设置本地模式
在hive0.7版本之后就开始支持任务执行选择本地模式(local mode),尽管hive是基于hadoop集群来做大数据处理的,但是有时会出现输入的数据量非常小,其查询出发执行任务的消耗时间远远大于job执行时间,这种情况下,本地执行任务是不是更加效率?
设置方式:set hive.exec.mode.local.auto=true
2、并行执行
对于某个job,若存在许多阶段可以并行执行,则集群利用率会变高,提高了查询的效率(系统资源空闲情况下)
设置方式:set hive.exec.parallel=true
set hive.exec.parallel.thread.number=16; //同一个sql运行最大并行度,默认为8
3、严格模式(默认为非严格模式)
严格模式的作用,是为了防止用户执行的危险查询,如下:
对于分区表,用户不允许扫描所有分区;
对于使用了order by语句的查询,要求必须使用limit语句;
限制笛卡尔积的查询
设置方式:修改配置信息hive.mapred.mode为strict(永久设置) | 命令 set hive.mapred.mode=strict(非永久方式)
4、JVM的重用
虚拟机的重用同样适用于大量的小文件的场景,尤其对于job种包含非常多的task任务时
设置方式:修改hadoop的mapred-site.xml文件设置 mapred.job.reuse.jvm.num.tasks(永久配置) | set mapred.job.reuse.jvm.num.tasks=n
5、Fetch抓取
对于某些查询可以直接跳过MR计算,查询table对应存储目录下的文件效率更高(全局查找,字段查找,filter查找,limit查找)
设置方式:修改hive/conf/hive-default.xml文件设置 hive.fetch.task.conversion 为more
6、数据倾斜的解决方法
之前有过相关博客:https://www.cnblogs.com/afeiiii/p/13582276.html
7、explain执行计划
通过执行计划来调节sql
8、合理设置map/reduce的数量
合理设置数量,可以提高效率,过多则会占用资源
设置方式:set dfs.block.size=n(n默认为128MB,合理降低可以增加map)
set mapred.reduce.tasks=n