Spark讀Hbase優化 --手動划分region提高並行數


一. 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM