Hive之語句調優


1.數據過濾

盡量先過濾數據,減少每個階段的數據量,然后再進行join

2.分區

要合理使用分區,hive分區數據文件是放在不同目錄下的

3.執行順序

hive總是按照從左到右的順序執行語句

4.job任務數

hive會對每次join啟動一個mapreduce任務

當對3個或者更多個表進行join連接時,如果每個on都使用相同的連接鍵的話,那么只會產生一個mapreduce job

啟動一次job盡可能的多做事情,一個job能完成的事情,不要兩個job來做

5.join

hive順序從左到右,同時假定最后一個表是最大的表。所以連接時小表放前邊,先進內存,然后掃描大表進行計算

/*+STREAMTABLE(S)*/,hive會嘗試將表s作為驅動表,即使其在查詢中不是位於最后面的

/*MAPJOIN(A)*/ ,作用為小表先進內存,在mapper端直接join,省略掉reduce過程,減少大量時間

LEFT SEMI JOIN, 關聯前過濾條件,只在on過濾條件,相當於等值連接但是不會產生重復數據區別於join

6.排序

Order by ,全局排序,但是在一個reduce中執行,需消耗大量時間

Sort by,部分排序,多個reduce,只能實現部分排序

Distribute by和group by控制reducer如何接受一行行數據,sort by控制reducer內部是如何進行排序的。Hive中distribute by要寫在sort by之前,兩個一起使用可以實現order by

Cluster by,全局排序,但是只能默認升序

7.數據傾斜

避免數據傾斜,數據傾斜會使跑數時間大幅增加

8.小文件

如果數據量較大,一定要合並小文件,否則會非常影響表查詢的效率

Map輸入合並
set mapred.max.split.size=256000000;  #每個Map最大輸入大小
set mapred.min.split.size.per.node=100000000; #一個節點上split的至少的大小 
set mapred.min.split.size.per.rack=100000000; #一個交換機下split的至少的大小
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;  #執行Map前進行小文件合並
在開啟了org.apache.hadoop.hive.ql.io.CombineHiveInputFormat后,一個data node節點上多個小文件會進行合並,合並文件數由mapred.max.split.size限制的大小決定。
mapred.min.split.size.per.node決定了多個data node上的文件是否需要合並~
mapred.min.split.size.per.rack決定了多個交換機上的文件是否需要合並~

輸出合並
set hive.merge.mapfiles = true #在Map-only的任務結束時合並小文件
set hive.merge.mapredfiles = true #在Map-Reduce的任務結束時合並小文件
set hive.merge.size.per.task = 256*1000*1000 #合並文件的大小
set hive.merge.smallfiles.avgsize=16000000 #當輸出文件的平均大小小於該值時,啟動一個獨立的map-reduce任務進行文件merge

9.參數

善於使用hive的各類常用參數,提高語句效率

10.mapreduce

最好熟悉mapreduce整個運行原理,了解里面各個環節的加工過程,從而有針對性的去優化

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM