scala:创建一个hbase表,其中包含基于行键的预分割区域

h4cxqtbf  于 2021-06-10  发布在  Hbase
关注(0)|答案(2)|浏览(359)

我有三个区域服务器。我想基于我已经识别的行键(比如rowkey\u100和rowkey\u200),将一个hbase表平均分布到三个regionservres上。可以从hbase shell使用以下方法完成此操作:

  1. create 'tableName', 'columnFamily', {SPLITS => ['rowkey_100','rowkey_200']}

如果我没弄错的话,这两个分割点将创建3个区域,前100行将转到第一个区域服务器,下100行将在第二个区域服务器,其余行在最后一个区域服务器。我想用scala代码做同样的事情。我如何在scala代码中指定这一点来将表拆分为区域?

blmhpbnm

blmhpbnm1#

下面是用于创建带有拆分的hbase表的scala代码段:

  1. val admin = new HBaseAdmin(conf)
  2. if (!admin.tableExists(myTable)) {
  3. val htd = new HTableDescriptor(myTable)
  4. val hcd = new HColumnDescriptor(myCF)
  5. val splits = Array[Array[Byte]](splitPoint1.getBytes, splitPoint2.getBytes)
  6. htd.addFamily(hcd)
  7. admin.createTable(htd, splits)
  8. }

有一些预定义的区域分割策略,但如果要创建自己的方式来设置跨越行键范围的分割点,可以创建如下简单函数:

  1. def autoSplits(n: Int, range: Int = 256) = {
  2. val splitPoints = new Array[Array[Byte]](n)
  3. for (i <- 0 to n-1) {
  4. splitPoints(i) = Array[Byte](((range / (n + 1)) * (i + 1)).asInstanceOf[Byte])
  5. }
  6. splitPoints
  7. }

把这句话注解掉就行了 val splits = ... 管路和更换 createTablesplits 参数 autoSplits(2) 或者 autoSplits(4, 128) 等等。

展开查看全部
juzqafwq

juzqafwq2#

这个java代码可以帮助

  1. HTableDescriptor td = new HTableDescriptor(TableName.valueOf("tableName"));
  2. HColumnDescriptor cf = new HColumnDescriptor("cf".getBytes());
  3. td.addFamily(cf);
  4. byte[][] splitKeys = new byte[] {key1.getBytes(), key2.getBytes()};
  5. HBaseAdmin dbAdmin = new HBaseAdmin(conf);
  6. dbAdmin.createTable(td, splitKeys);

相关问题