【Hive】性能調優 - map-side JOIN

Hive版本: hive-1.1.0-cdh5.14.2

概述

如果表關聯時,有一張表很小,那麼可以在大表通過mapper時將小表完全加載到內存中,Hive可以在map端完成關聯過程,這就是所謂的map-side JOIN。
使用map-side JOIN可以省掉常規的reduce過程,從而提升Hive的效率。
Hive中有三個和map-side JOIN相關的參數:

參數 默認值
hive.auto.convert.join true (Hive 0.11.0+)
hive.auto.convert.join.noconditionaltask true
hive.auto.convert.join.noconditionaltask.size 10000000(10M)

如果想使用map-side JOIN,重點關注hive.auto.convert.join.noconditionaltask.size就可以了,可以認爲如果小表的大小超過此參數的值(默認10M),Hive就不會自動優化爲map-side JOIN。但可以根據節點的實際內存大小,合理調整此參數值。
Hive官方文檔對參數有如下解釋:
在這裏插入圖片描述
注意:

由於map-side JOIN只能流化一個表到內存,而全外連接( Full Outer join)需要關聯後兩張表的數據,所以暫不能使用此優化。
在這裏插入圖片描述

測試

下面是對hive.auto.convert.join.noconditionaltask.size的簡單測試:
測試環境中有兩張表youtubevideo_orc(132.42M),youtubevideo_user_orc(17.33M)
在這裏插入圖片描述在這裏插入圖片描述

1. hive.auto.convert.join.noconditionaltask.size不做調整

因以上二表的任一個都大於此參數的默認值(10M),所以Hive會執行reduce-side JOIN,而非map-side JOIN

0: jdbc:hive2://node03:10000> explain select t1.uploader,t2.friends from youtubevideo_orc t1 
. . . . . . . . . . . . . . > join youtubevideo_user_orc t2 on t1.uploader = t2.uploader
. . . . . . . . . . . . . . > limit 10;

在執行計劃中可以看出,Hive依然執行了reduce過程:
在這裏插入圖片描述

2. hive.auto.convert.join.noconditionaltask.size調整爲20M

因youtubevideo_user_orc(17.33M),符合小於hive.auto.convert.join.noconditionaltask.size的值,所以Hive會自動調整爲map-side JOIN。

0: jdbc:hive2://node03:10000> set hive.auto.convert.join.noconditionaltask.size = 20000000;
No rows affected (0.005 seconds)
0: jdbc:hive2://node03:10000> explain select t1.uploader,t2.friends from youtubevideo_orc t1 
. . . . . . . . . . . . . . > join youtubevideo_user_orc t2 on t1.uploader = t2.uploader
. . . . . . . . . . . . . . > limit 10;

在執行計劃中可以看出,Hive只執行map,而沒有reduce過程(非重要部分已在截圖中省略):
在這裏插入圖片描述

3. Full Outer Join不會使用map-side JOIN

關聯方式改爲Full Outer Join後,即使hive.auto.convert.join.noconditionaltask.size調整爲20M,Hive依然使用reduce-side JOIN,而非map-side JOIN。

0: jdbc:hive2://node03:10000> set hive.auto.convert.join.noconditionaltask.size = 20000000;
0: jdbc:hive2://node03:10000> explain select t1.uploader,t2.friends from youtubevideo_orc t1 
. . . . . . . . . . . . . . > full outer join youtubevideo_user_orc t2 on t1.uploader = t2.uploader
. . . . . . . . . . . . . . > limit 10;

在這裏插入圖片描述

總結

map-side JOIN可以省掉reduce過程,從而提高Hive效率;
Hive 0.11.0版本後,默認開啓自動map-side JOIN優化,我們需要合理調整hive.auto.convert.join.noconditionaltask.size參數值。

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