一. Hbase的region
我們先簡單介紹下Hbase的架構和Hbase的region:

從物理集群的角度看,Hbase集群中,由一個Hmaster管理多個HRegionServer,其中每個HRegionServer都對應一台物理機器,一台HRegionServer服務器上又可以有多個Hregion(以下簡稱region)。要讀取一個數據的時候,首先要先找到存放這個數據的region。而Spark在讀取Hbase的時候,讀取的Rdd會根據Hbase的region數量划分stage。所以當region存儲設置得比較大導致region比較少,而spark的cpu core又比較多的時候,就會出現無法充分利用spark集群所有cpu core的情況。
我們再從邏輯表結構的角度看看Hbase表和region的關系。
- Hbase是通過把數據分配到一定數量的region來達到負載均衡的。一個table會被分配到一個或多個region中,這些region會被分配到一個或者多個regionServer中。在自動split策略中,當一個region達到一定的大小就會自動split成兩個region。
- Region由一個或者多個Store組成,每個store保存一個columns family,每個Strore又由一個memStore和0至多個StoreFile組成。memStore存儲在內存中,StoreFile存儲在HDFS上。
- region是HBase中分布式存儲和負載均衡的最小單元。不同Region分布到不同RegionServer上,但並不是存儲的最小單元。
二. Spark讀取Hbase優化及region手動拆分
在用spark的時候,spark正是根據hbase有多少個region來划分stage。也就是說region划分得太少會導致spark讀取時的並發度太低,浪費性能。但如果region數目太多就會造成讀寫性能下降,也會增加ZooKeeper的負擔。所以設置每個region的大小就很關鍵了。
自0.94.0版本以來,split還有三種策略可以選擇,不過一般使用默認的分區策略就可以滿足需求,我們要修改的是會觸發region分區的存儲容量大小。
而在0.94.0版本中,默認的region大小為10G,就是說當存儲的數據達到10G的時候,就會觸發region分區操作。有時候這個值可能太大,這時候就需要修改配置了。我們可以在HBASE_HOME/conf/hbase-site.xml文件中,增加如下配置:
<property>
<name>hbase.hregion.max.filesize</name>
<value>536870912</value>
</property>
其中的value值就是你要修改的觸發region分區的大小,要注意這個值是以bit為單位的,這里是將region文件的大小改為512m。
修改之后我們就可以手動split region了,手動分區會自動根據這個新的配置值大小,將region已經存儲起來的數據進行再次進行拆分。
我們可以在hbase shell中使用split來進行操作,有以下幾種方式可以進行手動拆分。
split ‘tableName’
split ‘namespace:tableName’
split ‘regionName’ # format: ‘tableName,startKey,id’
split ‘tableName’, ‘splitKey’
split ‘regionName’, ‘splitKey’
這里使用的是split‘namespace:tableName’這種方式。其中tableName自不必多說,就是要拆分的表名,namespace可以在hbase的web界面中查看,一般會是default。
使用命令之后稍等一會,hbase會根據新的region文件大小去split,最終結果可以在web-ui的"table Details"一欄,點擊具體table查看。
以上~
推薦閱讀:
Spark DataFrame 的 groupBy vs groupByKey
spark RDD,reduceByKey vs groupByKey
