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整個運行原理,了解里面各個環節的加工過程,從而有針對性的去優化