认为在运行hive sql时可以根据数据情况进行设置,当然还有一些join的优化的配置需要单独研究。
mapred.reduce.tasks:每个作业的reduce任务数,默认是hadoop client的配置1个;
hive.exec.reducers.bytes.per.reducer:每个reducer的大小,默认是1G,输入文件如果是10G,那么就会起10个reducer;
hive.exec.reducers.max:reducer的最大个数,如果在mapred.reduce.tasks设置为负值,那么hive将取该值作为reducers的最大可能值。当然还要依赖(输入文件大小/hive.exec.reducers.bytes.per.reducer)所得出的大小,取其小值作为reducer的个数,hive默认是999;
hive.fileformat.check:加载数据文件时是否校验文件格式,默认是true;
hive.groupby.skewindata:group by操作是否允许数据倾斜,默认是false,当设置为true时,执行计划会生成两个map/reduce作业,第一个MR中会将map的结果随机分布到reduce中,达到负载均衡的目的来解决数据倾斜,可以参看阿里巴巴数据平台的这篇文章了解hive对于数据倾斜时group by的处理;
hive.groupby.mapaggr.checkinterval:map端做聚合时,group by 的key所允许的数据行数,超过该值则进行分拆,默认是100000;
hive.mapred.local.mem:本地模式时,map/reduce的内存使用量,默认是0,就是无限制;
hive.mapjoin.followby.map.aggr.hash.percentmemory:map端聚合时hash表的内存占比,该设置约束group by在map join后进行,否则使用hive.map.aggr.hash.percentmemory来确认内存占比,默认值0.3;
hive.map.aggr.hash.force.flush.memeory.threshold:map端聚合时hash表的最大可用内存,如果超过该值则进行flush数据,默认是0.9;
hive.map.aggr.hash.min.reduction:如果hash表的容量与输入行数之比超过这个数,那么map端的hash聚合将被关闭,默认是0.5,设置为1可以保证hash聚合永不被关闭;
hive.optimize.groupby:在做分区和表查询时是否做分桶group by,默认开启true;
hive.multigroupby.singlemr:将多个group by产出为一个单一map/reduce任务计划,当然约束前提是group by有相同的key,默认是false;
hive.optimize.cp:列裁剪,默认开启true,在做查询时只读取用到的列,这个是个有用的优化;
hive.optimize.index.filter:自动使用索引,默认不开启false;
hive.optimize.index.groupby:是否使用聚集索引优化group-by查询,默认关闭false;
hive.optimize.ppd:是否支持谓词下推,默认开启;所谓谓词下推,将外层查询块的 WHERE 子句中的谓词移入所包含的较低层查询块(例如视图),从而能够提早进行数据过滤以及有可能更好地利用索引。这篇中文文章简单的说明了在关系数据库里的应用;
hive.optimize.ppd.storage:谓词下推开启时,谓词是否下推到存储handler,默认开启,在谓词下推关闭时不起作用;
hive.ppd.recognizetransivity:在等值join条件下是否产地重复的谓词过滤器,默认开启;
hive.join.cache.size:在做表join时缓存在内存中的行数,默认25000;
hive.mapjoin.bucket.cache.size:mapjoin时内存cache的每个key要存储多少个value,默认100;
hive.optimize.skewjoin:是否开启数据倾斜的join优化,默认不开启false;
hive.skewjoin.key:判断数据倾斜的阈值,如果在join中发现同样的key超过该值则认为是该key是倾斜的join key,默认是100000;
hive.skewjoin.mapjoin.map.tasks:在数据倾斜join时map join的map数控制,默认是10000;
hive.skewjoin.mapjoin.min.split:数据倾斜join时map join的map任务的最小split大小,默认是33554432,该参数要结合上面的参数共同使用来进行细粒度的控制;
hive.mapred.mode:hive操作执行时的模式,默认是nonstrict非严格模式,如果是strict模式,很多有风险的查询会被禁止运行,比如笛卡尔积的join和动态分区;