一棵操作符樹。
hql:
insert overwrite table access_log_temp2
select a.user, a.prono, p.maker, p.price
from access_log_hbasea join product_hbasep on (a.prono= p.prono);
相應物理查詢計畫:
hive架構於mapreduce framework之上,執行計畫的靈活性較差,優化器可做的選擇很少,例如:join演算法只有grace hash join一種選擇,效能更加優秀且穩定的hybrid hash join則無法實現; map端的group-by演算法只有hash group-by一種選擇, reduce端的group-by只有sort group-by一種選擇(不然mapreduce提供的sort就浪費了); limit無法和sort融合起來,很多情況下,用堆排序來融合limit與sort會更加高效。 join, group-by, limit在olap,日誌分析等任務中非常常用的operator,而hive在這3個operator的實現上都依賴於mapreduce frameowork提供的partition和sort,好處是實現比較簡單,缺點是效率往往不是最優的。 然而,由於mapreduce資料處理流程的限制,效率更高的演算法卻無法實現。
大多數商用資料倉儲使用基於代價的優化器,在生成查詢計畫時,利用元資料中的統計資訊估算每個operator要處理的資料量,選取代價較低的執行計畫。不過,這些商用資料倉儲的都起步於基於規則的查詢優化器,而hive正處於這樣乙個類似的起步階段。因而hive查詢優化器能做的優化並不多,僅限於10幾條轉換規則。
對於查詢來說,索引的作用至關重要,儘管hive中的partition起到和索引類似的作用,但還比較初級,與並行資料倉儲較為完善的索引(primary,secondary, clustered, unclustered)還有很大差距。當然,hive也沒有緩衝區管理機制,只能依賴於檔案系統的緩衝機制;傳統的並行資料倉儲往往禁用作業系統的緩衝機制,針對不同的查詢的特點設計了多種緩衝機制,從而優化了效能。
記憶體拷貝會很大程度上拖累系統效能。我們可以注意到,hive中所有的hash,比較,數值運算操作,都需要操作在writable object上,而每次重置(reset)這些writable object,都需要將資料從byte array拷貝到這些物件的byte成員中。在更精巧的實現中,很多記憶體拷貝其實是可以避免的,傳統的並行資料倉儲往往做了很多優化(甚至包含作業系統核心的優化,比如teradata的pde)去節省不必要的記憶體拷貝,從而又帶來了效能提公升。
優勢與不足
ted的乙個很有意思的演講,我覺得很受啟發。大概意思就是,我們要進行多個方面的任務切換,不能夠總是專注於乙個領域。可能類似於流水線,但同時強調慢過程,一點點打磨,這反而是一件非常高效的事情。首先,關注不同的領域,可以讓你在一件事遇到困難時,切換到另外乙個工作狀態,從而持續興奮的去工作。比如說馬斯克,...
hive原理 未完。。
size medium hive就是乙個將hiveql 其實是sql的子集或者說一點點的超集 語句轉化為一系列可以在hadoop集群上執行的mr的工具,通常在客戶端執行 hive 命令 有ide,所以不用安裝hive啦 wink 然後輸入 sql 語句後,hive 將 sql 語句生成多個 mr 的...
Hive架構原理
1 使用者介面 client cli command line inte ce jdbc odbc jdbc訪問hive webui 瀏覽器訪問hive 2 元資料 metastore 元資料報括 表名 表所屬的資料庫 預設是default 表的擁有者 列 分割槽字段 表的型別 是否是外部表 表的資...