hive的執行流程

1. 執行流程概述

hive的執行流程
查看hive語句的執行流程:explain select ….from t_table …;

  • 查看hive語句的執行流程:explain select ….from t_table …;
  • 操作符是hive的最小執行單元
  • Hive通過execmapper和execreducer執行MapReduce程序,執行模式有本地模式和分佈式模式
  • 每個操作符代表一個 HDFS 操作或者 MapReduce 作業
    hive的操作符
    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;
hive的執行流程
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;
hive的執行流程
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任務,從而解決單節點的壓力過大。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章