「國際大學生節」又稱「世界大學生節」、「世界學生日」、「國際學生日」。1946年,世界各國學生表明於布拉格召開全世界學生大會,宣佈把每一年的11月17日定爲「世界大學生節」,以增強全世界大學生的團結和友誼。html
注意,本文討論的hive join優化器是從hive 0.11.0版本起添加的,數據庫
本文描述了Hive查詢執行計劃的優化,以提升join效率並減小對用戶提示的需求。緩存
Hive自動識別各類用例並對其進行優化。Hive 0.11改進了這些狀況的優化器:app
決策支持系統或數據倉庫的簡單模型是星型模型,其中事件在大型事實表中收集,而較小的支持表(維度表)用於描述數據。分佈式
星型模型示例性能
原有的mapjoin優化
hive支持map joins,該類型適合星型模型的場景,固然要求維度表要適合加載入內存。在0.11的發佈版本以前,mapjoin可使用優化器提示來激活:.net
或者,也能夠經過自動轉換:htm
hive 0.10版本的時候,hive.auto.convert.join的值是false,0.11改成了true。?blog
MAPJOIN經過將較小的表加載到內存中的hashmap中並在流傳輸時將key與較大的表匹配來處理。先前的實現有一下幾個步驟:
先前實現的侷限性
Hive 0.11以前的MAPJOIN實現具備如下限制:
星形join的加強功能
Hive 0.11中的優化器加強功能專一於有效處理星型模型中所需的join。最初的工做僅限於星型模型join,其中projection和filter後的全部維度表同時適合內存。如今也實現了只有一些維度表適合內存的情景(HIVE-3996)。
鏈接優化能夠分爲三個部分:
如下部分介紹了每種優化程序加強功能。
mapjoin的優化鏈
下面的查詢會產生兩個對立的僅有map 的job
可是,對於小尺寸表,所需的兩個表有可能同時適合裝入內存。這大大減小了執行此查詢所需的時間,由於事實表只讀取一次而不是讀取兩次並將其寫入HDFS以在job之間進行通訊。
若是設置爲true,則優化器不只會將鏈接轉換爲mapjoins,還會盡量地合併MJ *模式。
優化自動join轉換
當自動join啓動了,query中就不須要map-join的提示了。配置下面兩個參數能夠啓自動join選項
第一個配置是指定默認值。
在大小配置使用戶可以控制哪些尺寸表能夠存放在內存。此值表示能夠轉換爲適合內存的哈希映射的表大小的總和。目前,n-1個鏈接表必須適合裝入內存才能使map join優化生效。沒有檢查表是不是壓縮表以及表的潛在大小。這個假設對結果的影響將在下一節中討論。
例如,上面的例子能夠簡單寫爲:
若是time_dim和date_dim符合所提供的大小配置,則相應的join將轉換爲map-join。若是表的大小總和能夠小於配置的大小,則組合兩個map join,從而產生單個map join。這減小了所需的MR做業數量,並顯着提升了此查詢的執行速度。此示例也能夠輕鬆擴展爲多join,而且能夠按預期工做。
Outer joins?提供了更多挑戰。因爲map-join運算符只能流式傳輸一個表,所以流式表必須是全部行都須要的表。對於?left outer join,這是鏈接左側的表; 對於?right outer join,右側的表等。這意味着即便inner join能夠轉換爲map join,outer join也沒法轉換爲map join。在除了須要流式傳輸以外的表都小於配置的閾值大小的狀況下,outer join能夠轉化爲外部連接。full outer join沒法轉換爲map-join,由於兩個表都須要進行流式處理。
自動join轉換也會影響sort-merge-bucket join。
Hive0.13.0 及更高版本引入,默認爲false。
對於條件join,若是來自小別名的輸入流能夠直接應用於join運算符而不進行filter或projection,則無需經過MapReduce本地任務在分佈式緩存中預先劃分stage(pre-staged)。設置爲true可避免在這些狀況下進行預先分stage。
1.將盡量多的MJ操做分組爲一個MJ。
當Hive根據配置轉換join爲map-join時,會在這些轉換結束時儘量地將盡量多的join組合在一塊兒。若是參與各個map join的表的大小總和在配置的限制範圍內,則將這些MJ運算符組合在一塊兒,按順序進行。這確保了關於這些查詢的更多加速。
Sort-Merge-Bucket(SMB)join也能夠轉換爲SMB map join。在表進行排序和分桶的任何地方均可以使用SMB鏈接。join歸結爲僅合併已經排序的表,容許此操做比普通的map-join更快。可是,若是表是分區的,則可能會減慢速度,由於每一個mapper須要得到一個具備單個key分區的很是小塊。
如下配置設置能夠將SMB轉換爲map join SMB:
可使用如下配置設置大表選擇策略:
默認狀況下,選擇策略是平均分區大小。與hash表和流式傳輸表相比,大表選擇策略有助於肯定僅選擇哪一個表進行流式傳輸。
可用的選擇政策是:
類名稱描述了它們的用途。這對於事實 - 事實鏈接(TPC DS基準中的查詢82)特別有用。
若是表具備不一樣數量的key,例如表A有2個SORT列,而表B有1個SORT列,那麼可能會遇到索引超出範圍的異常。
如下查詢致使索引超出範圍異常,由於emp_person讓咱們說例若有1個排序列,而emp_pay_history有2個排序列。
錯誤Hive 0.11
下面就能夠正常運行
Hive 0.11
將來的工做將使在任務端徹底生成內存中的哈希表成爲可能。
在客戶端上生成哈希表(或多個join的多個哈希表)具備缺點。(*tropical客戶端機器是用於運行Hive客戶端並提交做業的主機。)
在客戶端計算機上預處理哈希表也有一些好處:
當在任務端徹底生成哈希表時,全部任務節點都必須訪問原始數據源以生成哈希表。因爲在正常狀況下這將並行發生,所以不會影響延遲,但Hive具備存儲處理程序的概念,而且許多任務訪問相同的外部數據源(HBase,數據庫等)可能會對數據源形成性能壓力。
推薦閱讀:
重磅:關於hive的join使用必須瞭解的事情
經驗|如何設置Spark資源
你真知道如何高效用mapPartitions嗎?