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

zzzzMing發表於2018-12-15

一. Hbase的region

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

Spark讀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

相關文章