1. 程式人生 > >Hive架構、傾斜優化、sql及常見問題

Hive架構、傾斜優化、sql及常見問題

con 共享 http bubuko 分發 block 分析器 auto 路徑

Hive架構

技術分享圖片
hive架構如圖所示,client跟driver交互,通過parser、planner、optimizer,最後轉為mapreduce運行,具體步驟如下
技術分享圖片

  1. driver輸入一條sql,會由parser轉為抽象語法樹AST,這個是沒有任務元數據信息的語法樹;
  2. 語法分析器再把AST轉為一個一個的QueryBlock,一個QueryBlock包含輸入、輸出、計算邏輯,也就是說一個子程序就是QueryBlock
  3. planner遍歷所有的QueryBlock,轉為一個個的Operator(算子,比如tablescanOperator),最後形成OperatorTree;
  4. 優化器對OperatorTree進行優化,包含謂詞下推、剪枝等;
  5. 然後遍歷OperatorTree,分割成多個mapreduce作業,形成物理計劃
  6. 之後進行物理優化,比如是否進行map join等

Hive 數據傾斜優化

  1. 對於group by可以有兩個優化點
    map聚合:set hive.map.aggr=true,會在map端對相同key先聚合一下;
    分發為兩道作業:set hive.groupby.skewindata=true,會對原來的一道作業分為兩道作業,第一道隨機分配key,第二道再按key分配
    註意:對於部分聚合函數有用,比如sum和count,但是完全聚合函數無用,比如avg
  2. 對於join也有兩個優化點
    map join:新版hive中默認開啟set hive.auto.convert.join=true ,join的左表如果足夠小,會直接把左表內容加載到內存中
    兩道作業:set hive.optimize.skewjoin = true;set hive.skewjoin.key = skew_key_threshold (default = 100000)這個兩道作業跟groupby不一樣,這個是說把超過10萬行的數據單獨啟一道map join,最後再把結果聚合

hive常見問題

  1. hive不支持非等值join
    錯誤:select from a inner join b on a.id<>b.id
    替代方法:select
    from a inner join b on a.id=b.id and a.id is null;
  2. hive不支持非join連接
    錯誤:select from dual a,dual b where a.key = b.key;
    正確:select
    from dual a join dual b on a.key = b.key;
  3. hive不支持or
    錯誤:select from a inner join b on a.id=b.id or a.name=b.name
    替代方法:select
    from a inner join b on a.id=b.id union all select * from a inner join b on a.name=b.name
  4. hive內部表和外部表的區別
    創建表時:創建內部表時,會將數據移動到數據倉庫指向的路徑;若創建外部表,僅記錄數據所在的路徑, 不對數據的位置做任何改變。
    刪除表時:在刪除表的時候,內部表的元數據和數據會被一起刪除, 而外部表只刪除元數據,不刪除數據。這樣外部表相對來說更加安全些,數據組織也更加靈活,方便共享源數據
  5. sortby、orderby、distributeby
    order by會引發全局排序;會導致所有的數據集中在一臺reducer節點上,然後進行排序,這樣很可能會超過單個節點的磁盤和內存存儲能力導致任務失敗。
    distribute by + sort by就是該替代方案,被distribute by設定的字段為KEY,數據會被HASH分發到不同的reducer機器上,然後sort by會對同一個reducer機器上的每組數據進行局部排序。

Hive架構、傾斜優化、sql及常見問題