ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
手动拆分有两种情况:**预拆分(pre-splitting)** 和 **强制拆分(forced splits)**。<br/> [TOC] # 1. 预拆分(pre-splitting) 预拆分(pre-splitting)就是在建表的时候就定义好了拆分点的算法,所以叫预拆分。使用 org.apache.hadoop.hbase.util.RegionSplitter 类来创建表,并传入拆分点算法就可以在建表的同时定义拆分点算法。 **1. 快速入门** 我们要新建一张表,并且规定了该表的 Region 数量永远只有 10 个。在 Linux下执行: ```sql [root@hadoop101 hbase]# hbase org.apache.hadoop.hbase.util.RegionSplitter my_split_table HexStringSplit -c 10 -f mycf -- my_split_table:我们指定要新建的表名 -- HexStringSplit:指定的拆分点算法为 HexStringSplit -- -c:要拆分的 Region 数量 -- -f:要建立的列族名称 ``` 建完后在 hbase shell 看一下结果。执行下面命令查出所有 10 个 Region 的信息: ```sql hbase(main):013:0> scan 'hbase:meta',{STARTROW=>'my_split_table',LIMIT=>10} ``` 可以看到已经建立的 10 个 Region,由于输出信息太多,我只截取其中关于每一个 Region 的起始 rowkey 和结束 rowkey 的信息,这 10 个 Region 的范围分别是: ```sql STARTKEY=>'', ENDKEY=>'19999999' STARTKEY=>'19999999', ENDKEY=>'33333332' STARTKEY=>'33333332', ENDKEY=>'4ccccccb' STARTKEY=>'4ccccccb', ENDKEY=>'66666664' STARTKEY=>'66666664', ENDKEY=>'7ffffffd' STARTKEY=>'7ffffffd', ENDKEY=>'99999996' STARTKEY=>'99999996', ENDKEY=>'b333332f' STARTKEY=>'b333332f', ENDKEY=>'ccccccc8' STARTKEY=>'ccccccc8', ENDKEY=>'e6666661' STARTKEY=>'e6666661', ENDKEY=>'' ``` 我们可以在hdfs上看到在my_split_table目录下创建了10个目下: ![](https://img.kancloud.cn/d7/8a/d78acd703819e89d56b82ebaa92c0a31_1468x670.png) 每个目录类似 ```sql /hbase/data/default/my_split_table/02e4690b3c5ed79c94d2eb5a625e90f6/mycf ``` 这就是你预定了拆分点后的 Region。 <br/> **2. 拆分算法**(扩展内容) (1)HexStringSplit 拆分算法 在快速入门例子中使用的算法就是 HexStringSplit 算法。HexStringSplit 把数据从"00000000"到"FFFFFFFF"之间的数据长度按照 n 等分之后算出每一段的起始 rowkey 和结束 rowkey,以此作为拆分点。就是这么简单。<br/> (2)UniformSplit 拆分算法 UniformSplit 有点像 HexStringSplit 的 byte 版,传参还是 n,唯一不一样的是起始和结束不是String,而是byte[]。起始rowkey是`ArrayUtils.EMPTY_BYTE_ARRAY`。结束 rowkey 是 `new byte[] {xFF, xFF, xFF, xFF, xFF, xFF, xFF, xFF}`。最后调用 `Bytes.split`方法把起始 rowkey 到结束 rowkey 之间的长度 n 等分,然后取每一段的起始和结束作为拆分点。默认的拆分点算法就这两个。 还可以通过实现 SplitAlgorithm 接口实现自己的拆分算法。或者干脆手动定出拆分点。 <br/> **3. 手动指定拆分点** 手动指定拆分点的方法就是在建表的时候跟上 SPLITS 参数,比如: ```sql create 'test_split2','mycf2',SPLITS=>['aaa','bbb','ccc','ddd','eee','fff'] ``` 上述语句在 HBase shell 中执行,执行完成后,可以通过 HBase Web UI 中查看相关信息,如下图。 ![](https://img.kancloud.cn/60/54/6054effe4b8d232b5ad26789208651f3_1254x402.png) ![](https://img.kancloud.cn/73/c6/73c6b0e213d67aee77c3ffa2a25fa31d_1352x150.png) ![](https://img.kancloud.cn/55/f3/55f3700556543308ee44ba896605ba0f_1794x644.png) 上面的手动分区是使用类似数组的形式指定的,除了这种方式外,还可以使用指定预分区文件的方式来操作。 (1)准备文件`splits.txt` ```sql aaa bbb ccc ddd eee fff ``` (2)创建预分区表 ```sql -- /hbase_datas/splits.txt 是存储在Linux系统上的文件 hbase(main):003:0> create 'students','baseinfo',SPLITS_FILE=>'/hbase_datas/splits.txt' ``` (3)创建好的预分区表通过 HBase Web UI查看如下图 ![](https://img.kancloud.cn/7a/8c/7a8c65b9a9bfdffac7479458f6c68b34_1841x635.png) <br/> # 2. 强制拆分(forced splits) 除了预拆分和自动拆分以外,有时候可以对运行了一段时间的 Region 进行强制地手动拆分(forced splits)。方法是调用 hbase shell 的 split 方法,比如:对前面的 students 表中的 starkey=aaa,endkey=bbb的region 进行强制拆分。 ```sql -- 'b' 就是新的拆分点 hbase(main):004:0> split '0fcc8f57234467027e825931ed1cb25d','b' ``` 拆分后如下图 ![](https://img.kancloud.cn/14/4a/144a0d2e4d66518eb05277bab092ff28_1837x694.png) ```sql 查看split的更多用法 hbase(main):013:0> split Examples: split 'tableName' split 'namespace:tableName' split 'regionName' # format: 'tableName,startKey,id' split 'tableName', 'splitKey' split 'regionName', 'splitKey ```