1. 程式人生 > >Hive的優化方法

Hive的優化方法

1、join連線時的優化:當超過2個表進行join關聯操作時,如果 on 後面 JOIN 的 key 相同,不管有多少個表,都會則會合併為一個 Map-Reduce。

INSERT OVERWRITE TABLE test_users 
SELECT 
    t.pageid,
    u.age 
FROM test_view t 
JOIN user u ON (t.userid = u.userid) 
JOIN newuser x ON (t.userid = x.userid);
--只生成一個MapReduce

2、join連線時的優化:當多個表進行查詢時,從左到右表的大小順序應該是從小到大。原因:hive在對每行記錄操作時會把其他表先快取起來,直到掃描最後的表進行計算。如果所有表中有一張表足夠小,則可置於記憶體中,這樣在和其他表進行連線的時候就能完成匹配,省略掉reduce過程。設定屬性即可實現,set hive.auto.covert.join=true; 使用者可以配置希望被優化的小表的大小 set hive.mapjoin.smalltable.size=2500000; 如果需要使用這兩個配置可置入$HOME/.hiverc檔案中。 3、在where子句中增加分割槽過濾器。 4、當可以使用LEFT SEMI JOIN 語法時不要使用INNER JOIN語法,前者效率更高。原因:對於左表中指定的一條記錄,一旦在右表中找到立即停止掃描。用LEFT SEMI JOIN 當A表中的記錄,在B表上產生符合條件之後就返回,不會再繼續查詢B表記錄了,所以如果B表有重複,也不會產生重複的多條記錄;當子表中存在重複的資料,當使用JOIN ON的時候,A,B表會關聯出兩條記錄,應為ON上的條件符合。 5、同一種資料的多種處理:從一個數據源產生的多個數據聚合,無需每次聚合都需要重新掃描一次。 例如:insert overwrite table student select * from employee; insert overwrite table person select * from employee; 可以優化成:from employee insert overwrite table student select * insert overwrite table person select * 6、limit調優:limit語句通常是執行整個語句後返回部分結果。set hive.limit.optimize.enable=true; 7、開啟併發執行。某個job任務中可能包含眾多的階段,其中某些階段沒有依賴關係可以併發執行,開啟併發執行後job任務可以更快的完成。設定屬性:set hive.exec.parallel=true; 8、hive提供的嚴格模式,禁止3種情況下的查詢模式。 a:當表為分割槽表時,where字句後沒有分割槽欄位和限制時,不允許執行。 b:當使用order by語句時,必須使用limit欄位,因為order by 只會產生一個reduce任務。 c:限制笛卡爾積的查詢。 9、合理的設定map和reduce數量。 10、jvm重用。可在hadoop的mapred-site.xml中設定jvm被重用的次數。