簡體   English   中英

蜂巢的斗圖加入

[英]Hive's Bucket Map Join

我有一個Hadoop集群,我使用Hive進行查詢,我想連接兩個大表,其中一個有小存儲桶,從我的閱讀中看來,如果我將兩個表都存儲在join-key上,那將有助於提高性能。 。

所以我的設置是:

  • 將連接鍵上的兩個表都存儲到相同數量的存儲桶中,
  • 較小表的存儲桶可容納在內存中,
  • 設置hive.optimize.bucketmapjoin = true;
  • 運行以下查詢:
SELECT /*+ MAPJOIN(a) */
 count(*)
FROM a JOIN B ON  a.join_key = b.join_key;

問題1:以上設置足以觸發存儲桶映射連接嗎?

問題2:我對存儲桶映射連接的理解是,它啟動了一個本地任務,該任務創建每個存儲桶的哈希表,然后將散列的存儲桶上載到每個映射器。 這種理解正確嗎?

問題3:如果以上理解正確,那么為什么Hive會在本地進行哈希處理? 為什么它不上傳原始存儲桶,然后在地圖任務中執行哈希運算,從而實現並行處理和更高的速度?

以上設置足以觸發存儲桶映射連接嗎?

答案:1)如果“表/分區的總大小很大,不利於地圖聯接”,則進行存儲桶地圖聯接。 所需的設置是:set hive.optimize.bucketmapjoin = true;

2)如果“表/分區大小沒有非常大的限制,即表大小”,則進行SortMerge存儲桶聯接。 所需的設置是:set hive.optimize.bucketmapjoin = true; 設置hive.optimize.bucketmapjoin.sortedmerge = true; 設置hive.input.format = org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat;

我對存儲桶映射連接的理解是,它啟動了一個本地任務,該任務創建每個存儲桶的哈希表,然后將哈希存儲桶上載到每個映射器。 這種理解正確嗎?

答案:如果是Bucket映射聯接,則1)配置單元運行本地映射減少聯接以創建HashTable文件,2)壓縮並存檔文件並將其加載到分布式緩存(i-大哈希表文件將減慢Distributed的傳播ii。映射器正在等待來自分布式緩存的哈希表文件。)3)加載到映射Join任務的映射器中。

如果以上理解正確,那么為什么Hive會在本地進行哈希處理? 為什么它不上傳原始存儲桶,然后在地圖任務中執行哈希運算,從而實現並行處理和更高的速度?

答案:如果文件很大,那么我們將遇到以下問題-大哈希表文件將減慢分布式緩存的傳播。 ii-映射器正在等待來自分布式緩存的哈希表文件。

因此,執行以下步驟將提高性能:

1)配置單元運行本地映射減少聯接以創建HashTable文件,2)壓縮並存檔文件並加載到分布式緩存
3)加載到地圖Join任務的映射器。

這比映射聯接或普通聯接具有更好的性能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM