hbase(四)-regionserver相關問題

1.hbase讀的過程

1,Client先訪問zookeeper,從meta表讀取region的位置,然後讀取meta表中的數據。meta中又存儲了用戶表的region信息。
2,根據namespace、表名和rowkey在meta表中找到對應的region信息
3,找到這個region對應的regionserver
4,查找對應的region
5,先從MemStore找數據,如果沒有,再到StoreFile上讀(爲了讀取的效率)。

2.hbase寫的過程

1,Client先訪問zookeeper,從meta表獲取相應region信息,然後找到meta表的數據
2,根據namespace、表名和rowkey根據meta表的數據找到寫入數據對應的region信息
3,找到對應的regionserver
4,把數據分別寫到HLog和MemStore上一份
4,MemStore達到一個閾值後則把數據刷成一個StoreFile文件。(若MemStore中的數據有丟失,則可以總HLog上恢復)
5,當多個StoreFile文件達到一定的大小後,會觸發Compact合併操作,合併爲一個StoreFile,(這裏同時進行版本的合併和數據刪除。)
6,當Storefile大小超過一定閾值後,會把當前的Region分割爲兩個(Split),並由Hmaster分配到相應的HRegionServer,實現負載均衡

3.hbase一個regionserver(節點)最大可以容納多少個region

RegionServer的region數目取決於memstore的內存使用
region的數量的公式爲:((RS memory) * (total memstore fraction)) / ((memstore size)*(# column families))
但是官方文檔建議一個reigonserver的region數量在20-200個之間。
每個region擁有一組memstore(memstore的數量有hstore決定,hstore的數據由創建表時的指定的列族個數決定,所以 每個region的memstore的個數 = 表的列族的個數 ),可以通過配置來修改memstore佔用內存的大小,一般設置在 128 M – 256M之間。
RegionServer 分配一定比例的內存給它下面的所有memstore( 該比例大小 可通過hbase.regionserver.global.memstore.upperLimit 進行修改 ), 如果內存溢出(使用了太多的memstore),它可能會導致嚴重的後果,如服務器反應遲鈍 或compact風暴。比較好的計算每RS(假設一個表)region的數量的公式爲:
((RS memory) * (total memstore fraction)) / ((memstore size)*(# column families))
例如: 如果 一個RegionServer配置的內存是16g,使用默認配置( hbase默認regionserver分給memstore的比例是0.4 , 默認的menstore的佔用128M內存 ), 一個CF,那麼這個regionServer下的region的個數大約爲 16384 * 0.4 / (128*1) = 51個,實際測試大於這個數 一兩倍 也沒太大的問題。 一個HBase表包含一至多個region,那麼表的數目上限也是可以估算出來的。

4.一個regionserver可以容納多大的數據

對於生產場景中大表,最大的region大小主要是受compactions 的限制,大量大HFile的compact會降低羣集性能。目前,該建議的最大region大小爲10-20GB,而5-10GB是最優。

如果想讓HBase工作的更加平穩(Region個數控制在20~200之間,單Region大小控制在10G~30G之間),最多可以存儲的數據量差不多爲200 * 30G * 3= 18T。如果存儲的數據量超過18T,必然會引起或多或少的性能問題。所以說,從Region規模這個角度講,當前單臺RegionServer能夠合理利用起來的硬盤容量上限基本爲18T。

4.爲什麼要compact

寫入hbase的數據要經過MemStore,當MemStore超過閥值的時候,就要flush到HDFS上生成一個HFile。因此隨着不斷寫入,HFile的數量將會越來越多,HFile數量過多會降低讀性能,爲了避免對讀性能的影響,可以對這些HFile進行compact操作,把多個HFile合併成一個HFile。compact操作需要對HBase的數據進行多次的重新讀寫,因此這個過程會產生大量的IO。
也可以解釋上面問題regionserver的容量問題,可以說memstore和region的hfile大小決定了一個regionserver能夠容納多大的數據。

compact操作分爲major和minor兩種,major會把HStore所有的HFile都compact爲一個HFile,並同時忽略標記爲delete的KeyValue(被刪除的KeyValue只有在compact過程中才真正被”刪除”),可以想象major會產生大量的IO操作,對HBase的讀寫性能產生影響。minor則只會選擇數個HFile文件compact爲一個HFile,minor的過程一般較快,而且IO相對較低。在日常任務時間,都會禁止mjaor操作,只在空閒的時段定時執行。

5.爲什麼要split

當一個regionser的hfile大於一定的值時,compact就會產生大量IO,compact就會很困難,這時就要將一個region分裂爲兩個region。

region的分裂手段可以分爲:

  • 1.預分region,在創建表的時候指定預分點的key
  • 2.強制分裂,在hbase shell命令行裏面強制對某個region進行分裂
  • 3.自動分裂,region在達到一定值時自動的進行分裂。

參考

http://hbase.apache.org/book.html#regions.arch

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