Hive 做業優化

一、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注意事項

  • 只支持INSERT/LOAD操做,無UPDATE和DELTE
  • 0.10以前版本沒有索引
  • 不支持HAVING操做。
  • 不支持where子句中的子查詢
  • Join只支持等值關聯
  • Hive中string類型沒有長度限制

Not用法:
關係數據庫:
… where username not like(in) ..
Hive
… where not username like(in)..

 

轉自:https://blog.csdn.net/youfashion/article/details/72862453

相關文章
相關標籤/搜索