Mapreduce 讀取Hbase,寫入hbase IO 不均衡問題

硬件環境:h46h47h48 三個節點 2cpu 4核 共8個核心 14G 內存

軟件環境:

三臺機器分別部署hadoophbase 並同時作爲datanode 和 tasktracker regionserverHQuorumPeer

H46同時爲NamenodeJobtracker HMaster HQuorumPeer

出現問題:mapreduce 時使用 iostat 1| grep sdb 查看各節點的Io情況,發現h46有和適量的IOWrite h48 IOWrite 也在覈實範圍內,唯獨h47 基本沒有IO

查找原因:mapreduce 執行報告中如下提示

  Launched map tasks=207

local map tasks=92

意思是大多數map 的數據都不是本地的,根據原因查找數據量比較大的task 去查看其具體執行情況。

All Task Attempts

Task Attempts

Machine

attempt_201212071915_1816_m_000225_0

/default-rack/h47

意思是此task 是交給h47 來執行,沒有問題,但47爲什麼沒有IO

看下面

Input Split Locations

/default-rack/h48

也就是說 這個任務的數據是h48

爲什麼出現這種情況呢,爲什麼非要從48 遠程來跑task呢。

具體查看一下 .META.信息表 就可以看到,每個region 都是由具體的一個regionserver來管理,具體是哪個 是在每個region 的映射中的info:server 字段來指定。

可以查看 其實我的所有region 並沒有給h47regionserver 來管理,所以h47 就沒有IO

產生原因:

具體就看hmaster 是如何分配regions 

目前動態分配region是由master來分配,使用的是隨機分配regions

Hbase的 DefaultLoadBalance 是按照整體負載均衡的方式來分配region 的,而不是按照其中每張表所佔的region 進行均衡banlance,導致每張表可能會不均等的分配到不同的region 上。

所以就會出現 上面的情況,我們所訪問的hbase region 分配不均衡,但分配給具體TaskTracker的任務,而region 又不歸它管,導致local map tasks<< Launched map tasks=207

發佈了32 篇原創文章 · 獲贊 12 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章