Hive | 记录下执行SQL时常见的参数设置

// 基本任务参数设置
set mapred.reduce.tasks  = 1; // 设置任务reduce个数
set mapreduce.job.queuename = root.queueS1; // 设置任务执行队列 
set mapred.child.java.opts = -Xmx8096m ; // 内存大小
set mapred.job.name = 'Task1'; // 设置任务名称

// 文件大小控制 
set hive.merge.mapfiles=true; // 合并map输出 
set hive.merge.mapredfiles=true; // 合并reduce输出  
set hive.merge.size.per.task=256*1000*1000; // 合并文件的大小  一般可不设置 
set hive.mergejob.maponly=true; // 如果支持CombineHiveInputFormat则生成只有Map的任务执行merge 
set hive.merge.smallfiles.avgsize=16000000; // 文件的平均大小小于该值时,会启动一个MR任务执行merge。


// 数据倾斜
hive.map.aggr = true;
hive.groupby.skewindata = true;

// 并发执行
set hive.exec.parallel = true ,默认为false 
set hive.exec.parallel.thread.number = 8

set hive.optimize.cp=true; // 列裁剪 
set hive.optimize.prunner; // 分区裁剪 
set hive.limit.optimize.enable=true;// 优化LIMIT n语句 
set hive.limit.row.max.size=1000000;
set hive.limit.optimize.limit.file=10; // 最大文件数

// 推测执行 : 它根据一定的法则推测出'拖后腿'的任务,并为这样的任务启动一个备份任务,让该任务与原始任务同时处理同一份数据,并最终选用最先成功运行完成任务的计算结果作为最终结果。
set mapred.map.tasks.speculative.execution=true 
set mapred.reduce.tasks.speculative.execution=true 
set hive.mapred.reduce.tasks.speculative.execution=true;

// 多个group by合并
set hive.multigroupby.singlemar=true; 当多个GROUP BY语句有相同的分组列,则会优化为一个MR任务

// Combiner聚合
set hive.map.aggr=true; // 在map中会做部分聚集操作,效率更高但需要更多的内存。 
set hive.groupby.mapaggr.checkinterval=100000; // 在Map端进行聚合操作的条目数目

// 虚拟列 
set hive.exec.rowoffset=true; 是否提供虚拟列

// 分组 两个聚集函数不能有不同的DISTINCT列,以下表达式是错误的: 
SELECT name count(DISTINCT id), count(DISTINCT ip) FROM pv_users GROUP BY name; // SELECT语句中只能有GROUP BY的列或者聚集函数。


// 自定义map/reduce数目
set mapred.max.split.size 
set mapred.min.split.size 
set mapred.min.split.size.per.node 
set mapred.min.split.size.per.rack 
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat

增加map数目: 
当input的文件都很大,任务逻辑复杂,map执行非常慢的时候,可以考虑增加Map数,来使得每个map处理的数据量减少,从而提高任务的执行效率。
假设有这样一个任务: 
select data_desc, count(1), count(distinct id),sum(case when …),sum(case when ...),sum(…) from A group by data_desc
如果表A只有一个文件,大小为120M,但包含几千万的记录,如果用1个map去完成这个任务,肯定是比较耗时的,这种情况下,我们要考虑将这一个文件合理的拆分成多个,这样就可以用多个map任务去完成。 
  set mapred.reduce.tasks=10; 
  create table a_1 as select * from a distribute by rand(123);
这样会将a表的记录,随机的分散到包含10个文件的a_1表中,再用a_1代替上面sql中的a表,则会用10个map任务去完成。每个map任务处理大于12M(几百万记录)的数据,效率肯定会好很多。

// 关于 reduce数目设置: reducer数=min(参数2,总输入数据量/参数1)
set hive.exec.reducers.bytes.per.reducer=1G; // 参数1 : 每个reduce任务处理的数据量
set hive.exec.reducers.max=999(0.95*TaskTracker数); // 参数2: 每个任务最大的reduce数目
set mapred.reduce.tasks = 1; // 每个任务默认的reduce数目。典型为0.99*reduce槽数,hive将其设置为-1,自动确定reduce数目。

// 使用索引:
set hive.optimize.index.filter = true; // 自动使用索引 
set hive.optimize.index.groupby = true; // 使用聚合索引优化GROUP BY操作

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章