hive的join優化


640?wx_fmt=png

“國際大學生節”又稱“世界大學生節”、“世界學生日”、“國際學生日”。1946年,世界各國學生代表於布拉格召開全世界學生大會,宣布把每年的11月17日定為“世界大學生節”,以加強全世界大學生的團結和友誼。

640?wx_fmt=png

注意,本文討論的hive join優化器是從hive 0.11.0版本起添加的,

本文描述了Hive查詢執行計划的優化,以提高join效率並減少對用戶提示的需求。

Hive自動識別各種用例並對其進行優化。Hive 0.11改進了這些情況的優化器:

決策支持系統或數據倉庫的簡單模型是星型模型,其中事件在大型事實表中收集,而較小的支持表(維度表)用於描述數據。

星型模型示例

 
        

原有的mapjoin

hive支持map joins,該類型適合星型模型的場景,當然要求維度表要適合加載入內存。在0.11的發布版本之前,mapjoin可以使用優化器提示來激活:

 
        

或者,也可以通過自動轉換:

 
        

hive 0.10版本的時候,hive.auto.convert.join的值是false,0.11改為了true。?

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嗎?

640?wx_fmt=jpeg


文章來源:https://blog.csdn.net/rlnLo2pNEfx9c/article/details/82322343


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM