Hive架構、傾斜優化、sql及常見問題
阿新 • • 發佈:2019-05-17
con 共享 http bubuko 分發 block 分析器 auto 路徑 Hive架構
hive架構如圖所示,client跟driver交互,通過parser、planner、optimizer,最後轉為mapreduce運行,具體步驟如下
- driver輸入一條sql,會由parser轉為抽象語法樹AST,這個是沒有任務元數據信息的語法樹;
- 語法分析器再把AST轉為一個一個的QueryBlock,一個QueryBlock包含輸入、輸出、計算邏輯,也就是說一個子程序就是QueryBlock
- planner遍歷所有的QueryBlock,轉為一個個的Operator(算子,比如tablescanOperator),最後形成OperatorTree;
- 優化器對OperatorTree進行優化,包含謂詞下推、剪枝等;
- 然後遍歷OperatorTree,分割成多個mapreduce作業,形成物理計劃
- 之後進行物理優化,比如是否進行map join等
Hive 數據傾斜優化
- 對於group by可以有兩個優化點
map聚合:set hive.map.aggr=true,會在map端對相同key先聚合一下;
分發為兩道作業:set hive.groupby.skewindata=true,會對原來的一道作業分為兩道作業,第一道隨機分配key,第二道再按key分配
註意:對於部分聚合函數有用,比如sum和count,但是完全聚合函數無用,比如avg - 對於join也有兩個優化點
map join:新版hive中默認開啟set hive.auto.convert.join=true ,join的左表如果足夠小,會直接把左表內容加載到內存中
hive常見問題
- 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; - hive不支持非join連接
正確:select from dual a join dual b on a.key = b.key; - 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 - hive內部表和外部表的區別
創建表時:創建內部表時,會將數據移動到數據倉庫指向的路徑;若創建外部表,僅記錄數據所在的路徑, 不對數據的位置做任何改變。
刪除表時:在刪除表的時候,內部表的元數據和數據會被一起刪除, 而外部表只刪除元數據,不刪除數據。這樣外部表相對來說更加安全些,數據組織也更加靈活,方便共享源數據 - sortby、orderby、distributeby
order by會引發全局排序;會導致所有的數據集中在一臺reducer節點上,然後進行排序,這樣很可能會超過單個節點的磁盤和內存存儲能力導致任務失敗。
distribute by + sort by就是該替代方案,被distribute by設定的字段為KEY,數據會被HASH分發到不同的reducer機器上,然後sort by會對同一個reducer機器上的每組數據進行局部排序。
Hive架構、傾斜優化、sql及常見問題