一. 問題描述
大表 通過 非等值連接 關聯 小表,數據量激增,但是Hadoop沒有讀取到,導致只分配了6個map數,運行時間長達90分鐘,此時集羣很多資源都處於空閒狀態。
二. 解決方案
問題分析,主要是因爲非等值連接,導致hive錯誤的估計了數據量,進而map數分配少了。
2.1 初步方案嘗試
這些都試過,無用
-- 修改reduce個數
set mapred.reduce.tasks=10;
-- MapJoin
/*+ MAPJOIN(b) */
-- 排序
distribute by rand(123)
2.2 還得是官網
Hive官網:
Map個數的計算公式:
Num_Map_tasks= $inputsize/ max($mapred.min.split.size, min($dfs.block.size, $mapred.max.split.size))
dfs.block.size 這個系統值,不能修改,參考官網,修改如下參數至一個合適的值,問題解決。
set mapred.max.split.size=10000000 ;
set mapred.min.split.size=10000000;