簡單了解
概述

由上圖可以看出,每一個表都有屬於自己的一個Region,但Region內的數據達到10GB時,會進行分割,但仍會在同一個RegionServer上,而預分區的作用主要是增加數據讀寫效率、負載均衡、防止數據傾斜、方便集群容災調度Region和優化Map數量
設置預分區
在設置預分區前要先明白一個概念,每一個Region都維護着從StartKey到EndKey的數據,如果加入的數據符合某個Region的rowKey范圍,就把數據交給這個Region維護
比如說,現在有三個分區,它們的StartKey和EndKey分別是1-1000,1001-2000,2001-3000,現在如果有一條rowKey為1888的數據,那么他就會被分配到第二個Region中
預分區的設置方法一共有四種:
一、手動指定預分區
進入hbase shell輸入一下命令
create 'staff','info','partition1',SPLITS => ['1000','2000','3000','4000']
二、使用16進制算法生成預分區
進入hbase shell輸入一下命令
create 'staff2','info','partition2',{NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}
三、將分區規則寫在文本文件中
首先在/export/servers目錄下創建splits.txt文本文件,並輸入一下內容
aaaa
bbbb
cccc
dddd
然后在hbase shell中執行以下命令
create 'staff3','partition2',SPLITS_FILE => '/export/servers/splits.txt'
四、使用JavaAPI進行預分區
import org.apache.hadoop.conf.Configuration;
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.testng.annotations.Test;
import java.io.IOException;
public class HbasePartition {
/** * 通過javaAPI進行HBase的表的創建以及預分區操作 */
@Test
public void hbaseSplit() throws IOException {
//獲取連接
Configuration configuration = HBaseConfiguration.create();
configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181");
Connection connection = ConnectionFactory.createConnection(configuration);
Admin admin = connection.getAdmin();
//自定義算法,產生一系列Hash散列值存儲在二維數組中
byte[][] splitKeys = {{1,2,3,4,5},{'a','b','c','d','e'}};
//通過HTableDescriptor來實現我們表的參數設置,包括表名,列族等等
HTableDescriptor hTableDescriptor = new HTableDescriptor(TableName.valueOf("stuff4"));
//添加列族
hTableDescriptor.addFamily(new HColumnDescriptor("f1"));
//添加列族
hTableDescriptor.addFamily(new HColumnDescriptor("f2"));
admin.createTable(hTableDescriptor,splitKeys);
admin.close();
}
}

注意
在實際工作當中,創建表時一般都需要提前做預分區處理,一般來說每台服務器上面設置兩個到五個的預分區,這么做可以更好地減少Split的過程,在設置預分區時,rowKey的設計尤為重要
關於rowKey的設計可以查看文章:【HBase】快速了解上手rowKey的設計技巧
