(what)什么是預分區?
HBase表在剛剛被創建時,只有1個分區(region),當一個region過大(達到hbase.hregion.max.filesize屬性中定義的閾值,默認10GB)時,
表將會進行split,分裂為2個分區。表在進行split的時候,會耗費大量的資源,頻繁的分區對HBase的性能有巨大的影響。
HBase提供了預分區功能,即用戶可以在創建表的時候對表按照一定的規則分區。
(why)預分區的目的是什么?
減少由於region split帶來的資源消耗。從而提高HBase的性能。
(how)如何預分區?
===方法1===
通過HBase shell來創建。命令樣例如下:
create 't1', 'f1', SPLITS => ['10', '20', '30', '40']
create 't1', {NAME =>'f1', TTL => 180}, SPLITS => ['10', '20', '30', '40']
create 't1', {NAME =>'f1', TTL => 180}, {NAME => 'f2', TTL => 240}, SPLITS => ['10', '20', '30', '40']
命令截圖:
從Web界面查看表結構
===方法2===
仍然是通過HBase shell來創建,不過是通過讀取文件
1、在任意路徑下創建一個保存分區key的文件,我這里如下
路徑:/home/hadmin/hbase-1.3.1/txt/splits.txt
內容如下圖
2、通過HBase shell命令創建表
命令樣例:
create 't1', 'f1', SPLITS_FILE => '/home/hadmin/hbase-1.3.1/txt/splits.txt'
create 't1', {NAME =>'f1', TTL => 180}, SPLITS_FILE => '/home/hadmin/hbase-1.3.1/txt/splits.txt'
create 't1', {NAME =>'f1', TTL => 180}, {NAME => 'f2', TTL => 240}, SPLITS_FILE => '/home/hadmin/hbase-1.3.1/txt/splits.txt'
操作截圖:
Web界面結果:
====方法3==
通過java api創建,代碼樣例如下:
package api; 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.apache.hadoop.hbase.util.Bytes; public class create_table_sample2 { public static void main(String[] args) throws Exception { Configuration conf = HBaseConfiguration.create(); conf.set("hbase.zookeeper.quorum", "192.168.1.80,192.168.1.81,192.168.1.82"); Connection connection = ConnectionFactory.createConnection(conf); Admin admin = connection.getAdmin(); TableName table_name = TableName.valueOf("TEST1"); if (admin.tableExists(table_name)) { admin.disableTable(table_name); admin.deleteTable(table_name); } HTableDescriptor desc = new HTableDescriptor(table_name); HColumnDescriptor family1 = new HColumnDescriptor(constants.COLUMN_FAMILY_DF.getBytes()); family1.setTimeToLive(3 * 60 * 60 * 24); //過期時間 family1.setMaxVersions(3); //版本數 desc.addFamily(family1); byte[][] splitKeys = { Bytes.toBytes("row01"), Bytes.toBytes("row02"), }; admin.createTable(desc, splitKeys); admin.close(); connection.close(); } }
--END--