hbase建表时,支持预分区,在shell中操作:
hbase(main):033:0> create \'t1\',\'f1\',SPLITS => [\'10\',\'20\',\'30\'] hbase(main):027:0> put \'t1\',\'5\',\'f1:c1\',\'1\' 0 row(s) in 0.0280 seconds hbase(main):028:0> put \'t1\',\'20\',\'f1:c1\',\'1\' 0 row(s) in 0.1480 seconds hbase(main):029:0> put \'t1\',\'40\',\'f1:c1\',\'1\' 0 row(s) in 0.0100 seconds
需要注意的是,表t1建立4个分区:[min,\'10\'),[\'10\',\'20\'),[\'20\',\'30\'),[\'30\',max)
插入数据之后,数据可能还在内存,没有刷到hdfs,做下操作:
hbase(main):031:0> flush \'t1\' 0 row(s) in 1.5330 seconds
从hbase管理界面查看数据文件:
查看hdfs上t1的region如下:
drwxr-xr-x - hbase hbase 0 2018-07-29 16:13 /hbase/data/default/t1/398dc734620ed289ad7b2a03a33d8d5b drwxr-xr-x - hbase hbase 0 2018-07-29 15:19 /hbase/data/default/t1/3b114bc4a078c6593e495ffacda71d8e drwxr-xr-x - hbase hbase 0 2018-07-29 16:13 /hbase/data/default/t1/607dc0ffac9721c6ded846550ee418d6 drwxr-xr-x - hbase hbase 0 2018-07-29 15:19 /hbase/data/default/t1/8c4fb6c5fb9a52427a88dddc958bc6f4
查看其中一个region的f1列族的HFile文件信息如下:
-rw-r--r-- 3 hbase hbase 1034 2018-07-29 16:13 /hbase/data/default/t1/607dc0ffac9721c6ded846550ee418d6/f1/952bedb2b2f34dd9a2ff131202916475
刚刚插入了3条数据,那么这3条数据在些文件里面呢,需要记住的是hbase种rowkey按照字典序排列的,是字典序!,所以刚刚3条数据,rowkey=\'5\'和rowkey=\'40\'在最后一个分区,rowkey=\'20\'的在倒数第二个分区,特别容易误以为rowkey=\'5\'的落在了第一个分区,第一个分区只会存rowkey为\'00\',\'000\',\'01000\'.....这样的
还有一点主意的地方,如果对表truncate了,之后就没有预分区!
hbase(main):034:0> truncate \'t1\' Truncating \'t1\' table (it may take a while): - Disabling table... - Truncating table... 0 row(s) in 3.6830 seconds hbase(main):035:0> flush \'t1\'
查看hdfs:
hadoop fs -ls /hbase/data/default/t1/ drwxr-xr-x - hbase hbase 0 2018-07-29 17:38 /hbase/data/default/t1/6aed5d65799dda34b869a61c1f81159f