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操作

 

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