我們知道,HBASE在創建表的時候,會自動為表分配一個Region,當一個Region過大達到預設的閾值時(預設10GB大小),HBase中該Region將會進行split,分裂為2個Region,以此類推。表在進行split的時候,會耗費大量的資源,頻繁的分區對HBase的性能有巨大的影響。所以, ...
我們知道,HBASE在創建表的時候,會自動為表分配一個Region,
當一個Region過大達到預設的閾值時(預設10GB大小),HBase中該Region將會進行split,分裂為2個Region,以此類推。
表在進行split的時候,會耗費大量的資源,頻繁的分區對HBase的性能有巨大的影響。
所以,HBase提供了預分區功能,即用戶可以在創建表的時候對錶按照一定的規則分區。
假設我們初始給它10個Region,那麼導入大量數據的時候,就會均衡到10個裡面,顯然比1個Region要好很多。
可是我們應該創建多少個Region呢?顯然沒有具體答案,要結合業務,根據表的rowkey進行設計。
一.強制拆分
預分區方法:
1.hbase shell 預分區
建立分區前,要先瞭解表的rowkey格式,rowkey為:兩位隨機數+時間戳+客戶id
兩位隨機數的範圍從00-99,劃分範圍:小於10,10-20,20-30,30-40,40-50,50-60,60-70,70-80,90+
hbase(main):001:0> create 'log1', 'cf1', SPLITS => ['10','20','30','40','50','60','70','80','90']
啟動webUI
vi hbase-site.xml
添加
<property>
<name>hbase.master.info.port</name>
<value>60010</value>
</property>
瀏覽器中:
http://h201:60010
通過配置文件載入
[hadoop@h201 ~]$ cat rs.txt
10
20
30
40
50
60
70
80
90
hbase(main):003:0> create 'log2', 'cf1', SPLITS_FILE =>'/home/hadoop/rs.txt'
2.HBASE API 預分區
import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.client.HBaseAdmin; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.HColumnDescriptor; import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.Admin; import org.apache.hadoop.hbase.client.Connection; import org.apache.hadoop.hbase.client.ConnectionFactory; import org.apache.hadoop.hbase.util.Bytes; public class Cp { public static void main(String[] args) { HBaseConfiguration config = new HBaseConfiguration(); config.set("hbase.zookeeper.quorum", "h201,h202,h203"); String tablename = new String("ctest1"); try{ HBaseAdmin admin = new HBaseAdmin(config); if (admin.tableExists(tablename)) { admin.disableTable(tablename); admin.deleteTable(tablename); } HTableDescriptor tableDesc = new HTableDescriptor(tablename); tableDesc.addFamily(new HColumnDescriptor("cf1")); byte[][] splitKeys = { Bytes.toBytes("10"), Bytes.toBytes("20"), Bytes.toBytes("30") }; admin.createTable(tableDesc, splitKeys); admin.close(); }catch(IOException e) { e.printStackTrace(); } } }
驗證:
webUI查看
ctest1有4個 預分區
====================================================
二.自動拆分(Auto splitting)
1.
0.94 版本之前採用的是 ConstantSizeRegionSplitPolicy 策略。
這個策略非常簡單,從名字上就可以看出這個策 略就是按照固定大小來拆分Region。它唯一用到的參數是: hbase.hregion.max.filesize, 預設值是 10G, 也就是當 Region 的大小達到 10G 的時候, 會自動拆分成兩個 Region.
2.
0.94 版本之後,有了 IncreasingToUpperBoundRegionSplitPolicy 策略。並且預設使用的這種策略。這種策略從名字上就可以看出是限制不斷增長的文件尺寸的策略。
這種策略使用的最大store file size依據 Min(R^2 * “hbase.hregion.memstore.flush.size”, “hbase.hregion.max.filesize”),R代表同一臺Region Server節點上的region的個數。比如,在預設memstore flush size為128MB且預設的max store size為10G時。(R為region的個數)
第一次拆分大小為:min(10G,1*1*128M)=128M
第二次拆分大小為:min(10G,3*3*128M)=1152M
第三次拆分大小為:min(10G,5*5*128M)=3200M
第四次拆分大小為:min(10G,7*7*128M)=6272M
第五次拆分大小為:min(10G,9*9*128M)=10G
第五次拆分大小為:min(10G,11*11*128M)=10G
可以看到,只有在第四次之後的拆分大小才為10G