一、Join原則
將條目少的表/子查詢放在 Join的左邊。 緣由是在 Join 操做的 Reduce 階段,位於 Join左邊的表的內容會被加載進內存,將條目少的表放在左邊,能夠有效減小發生內存溢出的概率。
當一個小表關聯一個超大表時,容易發生數據傾斜,能夠用MapJoin把小表所有加載到內存在map端進行join,避免reducer處理。
如:SELECT /*+ MAPJOIN(user) */ l.session_id, u.username from user u join page_views l on (u. id=l.user_id) ;
二、笛卡爾積
當Hive設定爲嚴格模式(hive.mapred.mode=strict)時,不容許在HQL語句中出現笛卡爾積。
當沒法躲避笛卡爾積時,採用MapJoin,會在Map端完成Join操做,將Join操做的一個或多個表徹底讀入內存。
MapJoin的用法是在查詢/子查詢的SELECT關鍵字後面添加/*+ MAPJOIN(tablelist) */提示優化器轉化爲MapJoin 。數據庫
其中tablelist能夠是一個表,或以逗號鏈接的表的列表。tablelist中的表將會讀入內存,應該將小表寫在這裏session
三、控制Map數
同時可執行的map數是有限的。
•一般狀況下,做業會經過input的目錄產生一個或者多個map任務
•主要的決定因素有: input的文件總個數,input的文件大小。
•舉例
a) 假設input目錄下有1個文件a,大小爲780M,那麼hadoop會將該文件a分隔成7個塊(block爲128M,6個128m的塊和1個12m的塊),從而產生7個map數
b) 假設input目錄下有3個文件a,b,c,大小分別爲10m,20m,130m,那麼hadoop會分隔成4個塊(10m,20m,128m,2m),從而產生4個map數
兩種方式控制Map數:即減小map數和增長map數
減小map數能夠經過合併小文件來實現,這點是對文件數據源來說。
增長map數的能夠經過控制上一個job的reduer數來控制,見5.
oop
四、設置合理reducer個數優化
•reducer個數的設定極大影響執行效率
•不指定reducer個數的狀況下,Hive分配reducer個數基於如下:
參數1:hive.exec.reducers.bytes.per.reducer(默認爲1G)
參數2 :hive.exec.reducers.max(默認爲999)
•計算reducer數的公式
•N=min(參數2,總輸入數據量/參數1)
set mapred.reduce.tasks=13;.net
•reduce個數並非越多越好blog
同map同樣,啓動和初始化reduce也會消耗時間和資源;有多少個reduce,就會有多少個輸出文件。索引
Reducer數過多:
生成了不少個小文件,那麼若是這些小文件做爲下一個任務的輸入,則也會出現小文件過多的問題。
Reducer過少:
影響執行效率。
•什麼狀況下只有一個reduce
不少時候你會發現任務中無論數據量多大,無論你有沒有設置調整reduce個數的參數,任務中一直都只有一個reduce任務;
一、 除了數據量小於hive.exec.reducers.bytes.per.reducer參數值的狀況外
二、沒有group by的彙總
三、用了Order by。
內存
五、合併MapReduce操做hadoop
• Multi-group by:當從同一個源表進行屢次查詢時用。
•Multi-group by是Hive的一個很是好的特性,它使得Hive中利用中間結果變得很是方便
•FROM log資源
insert overwrite table test1 select log.id group by log.id
insert overwrite table test2 select log.name group by log.name
• 上述查詢語句使用了Multi-group by特性連續group by了2次數據,使用不一樣的group by key。這一特性能夠減小一次MapReduce操做。
6 、LEFT SEMI JOIN
是 IN/EXISTS 子查詢的一種更高效的實現。
Hive 當前沒有實現 IN/EXISTS 子查詢,因此你能夠用 LEFT SEMI JOIN 重寫你的子查詢語句。LEFT SEMI JOIN 的限制是, JOIN 子句中右邊的表只能在 ON 子句中設置過濾條件,在 WHERE 子句、SELECT 子句或其餘地方過濾都不行。
SELECT a.key, a.value
FROM a
WHERE a.key in
(SELECT b.key
FROM B);
能夠被重寫爲:
SELECT a.key, a.val
FROM a LEFT SEMI JOIN b on (a.key = b.key)
只能在 ON 子句中設置過濾條件。
七、Hive注意事項
Not用法:
關係數據庫:
… where username not like(in) ..
Hive
… where not username like(in)..
轉自:https://blog.csdn.net/youfashion/article/details/72862453