硬件環境:h46、h47、h48 三個節點 2cpu 4核 共8個核心 14G 內存
軟件環境:
三臺機器分別部署hadoop、hbase 並同時作爲datanode 和 tasktracker regionserver、HQuorumPeer;
H46同時爲Namenode、Jobtracker 和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 |
意思是此task 是交給h47 來執行,沒有問題,但47爲什麼沒有IO呢
看下面
Input Split Locations
/default-rack/h48
也就是說 這個任務的數據是h48的
爲什麼出現這種情況呢,爲什麼非要從48 遠程來跑task呢。
具體查看一下 .META.信息表 就可以看到,每個region 都是由具體的一個regionserver來管理,具體是哪個 是在每個region 的映射中的info:server 字段來指定。
可以查看 其實我的所有region 並沒有給h47的regionserver 來管理,所以h47 就沒有IO
產生原因:
具體就看hmaster 是如何分配regions 的
目前動態分配region是由master來分配,使用的是隨機分配regions
而Hbase的 DefaultLoadBalance 是按照整體負載均衡的方式來分配region 的,而不是按照其中每張表所佔的region 進行均衡banlance,導致每張表可能會不均等的分配到不同的region 上。
所以就會出現 上面的情況,我們所訪問的hbase 表region 分配不均衡,但分配給具體TaskTracker的任務,而region 又不歸它管,導致local map tasks<< Launched map tasks=207