1. 執行流程概述
查看hive語句的執行流程:explain select ….from t_table …;
- 查看hive語句的執行流程:explain select ….from t_table …;
- 操作符是hive的最小執行單元
- Hive通過execmapper和execreducer執行MapReduce程序,執行模式有本地模式和分佈式模式
- 每個操作符代表一個 HDFS 操作或者 MapReduce 作業
hive的操作符:
Hive編譯器的工作職責: - Parser:將Hql語句轉換成抽像的語法書(Abstract Syntax Tree)
- Semantic Analyzer:將抽象語法樹轉換成查詢塊
- Logic Plan Generator:將查詢樹,轉換成邏輯查詢計劃
- Logic Optimizer:重寫邏輯查詢計劃,優化邏輯執行計劃
- Physical Plan Gernerator:將邏輯執行計劃轉化爲物理計劃
- Physical Optimizer:選擇最佳的join策略,優化物理執行計劃
2. hive的具體執行過程分析
(1)Join(reduce join)
例:SELECT pv.pageid, u.age FROM page_view pv JOIN user u ON pv.userid = u.userid;
map 端:以 JOIN ON 條件中的列作爲 Key,以page_view表中的需要字段,表標識作爲value,最終通過key進行排序,也就是join字段進行排序。
shuffle端:根據 Key 的值進行 Hash,並將 Key/Value 對按照 Hash 值推 至不同對 Reduce 中
reduce 端:根據key進行分組,根據不同的表的標識,拿出不同的數據,進行拼接。
(2)group by
例:SELECT pageid, age, count(1) FROM pv_users GROUP BY pageid, age;
map 端:
key:以pageid, age作爲key,並且在map輸出端有combiner。
value :1次
reduce 端:對value進行求和
(3)distinct
例:select distinct age from log;
map端:
key:age
value:null
reduce端:
一組只要一個輸出context.write(key,null)。
(4)distinct+count
例:select count(distinct userid) from weibo_temp;
即使設置了reduce個數爲3個,最終也只會執行一個,因爲,count()是全局,只能開啓一個reducetask。
map端:
key:userid
value: null
reduce端:
一組只要一個,定義一個全局變量用於計數,在cleanup(Context context) 中輸出context.write(key,count)
當然distinct+count是一個容易產生數據傾斜的做法,應該儘量避免,如果無法避免,那麼就使用這種方法:
select count(1) from (select distinct userid from weibo_temp); 這樣可以並行多個reduce task任務,從而解決單節點的壓力過大。