2012-06-18 62 views
3

我有一個5節點的HBase集羣,主要具有獲取順序數據的輸入請求。通過分割區域實現HBase負載均衡

爲了優化存儲,我在高負載區域運行手動區域分割,但是它並沒有優化太多,因爲它會分割區域,但大部分位於同一個區域服務器上。

如何控制區域分裂這樣

r-1(k1 to k2) on server s1, 
r-2(k2 to k3) on server s2, 
r-3(k3 to k4) on server s3, 
r-4(k4 to k5) on server s4, 
r-5(k5 to k6) on server s5, 
r-6(k6 to k7) on server s1, 

即,分割後,沒有連續的區域去同一個服務器來控制同一臺服務器上的負載。

+0

是什麼讓你覺得這是造成問題?負載平衡器默認每5分鐘運行一次,並移動/分割區域以平衡羣集負載。這應該夠了。然後由HDFS處理羣集之間的分配。 –

+0

感謝Raze2dust的回覆。 在同一區域服務器上連續區域的唯一問題是 - 請求連續數據時,需要更多時間,因爲它超過了base.regionserver.handler.count和某些請求的限制進入等待狀態。 –

+0

只爲例如: 默認負載均衡後,我們注意到區域的分佈是喜歡 - R-1上S4, R-2上S1, R-3上S1, R-4上S2, R- S5上S2, r-6在S2上, r-7在S3上, r-8上s5,..現在每個區域的請求數/秒數幾乎相同。 但是獲取位於區域r-4到r-6之間的數據的新請求完全僅取決於單個服務器S-2。 如何控制區域分佈,使得沒有連續的區域進入同一臺服務器。 謝謝 –

回答

0

我假設你的服務器是指RegionServer。這些區域是隨機分配區域服務器的,所以如果你的集羣足夠大,這種情況不應該發生(或者應該很少發生)。這個想法是,你不應該爲此煩惱。另外,瞭解區域服務器只是數據的網關。它依靠HDFS獲取實際數據,數據來自何處,由HDFS決定。

此外,即使連續的區域最終由相同的RS服務,您也應該能夠使用多線程更快地獲取數據。 HBase已經在內部爲每個區域AFAIK運行一個單獨的線程。通常,它不會導致太多的負載。你有沒有看到由此造成的實際負荷過重?你有沒有做任何分析,看看是什麼造成的負載?

所以,應該沒有必要這樣做,但在特殊情況下,您可以使用HBaseAdmin.move方法來實現此目的。您可以使用HTable.getRegionLocations()編寫一些代碼以遍歷表的所有區域,按照開始鍵對區域進行排序並手動(using HBaseAdmin.move())確保所有連續區域位於不同的區域服務器上。但是我強烈懷疑這實際上是一個問題,我建議你在採用這種方法之前確認一下。

+0

謝謝Raze2dust,我會盡力的。 是的,我看到在運行協處理器時單個區域服務器上的負載也增加了heap-size以及region-server-handler-count,但仍有一些請求進入等待狀態。如果某些連續區域位於不同的區域服務器上,則等待時間將縮短。它發生在同一個請求觸發很多次(〜100)時。 –