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

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

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

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

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

blmhpbnm

blmhpbnm1#

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

val admin = new HBaseAdmin(conf)

if (!admin.tableExists(myTable)) {
  val htd = new HTableDescriptor(myTable)
  val hcd = new HColumnDescriptor(myCF)
  val splits = Array[Array[Byte]](splitPoint1.getBytes, splitPoint2.getBytes)

  htd.addFamily(hcd)
  admin.createTable(htd, splits)
}

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

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

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

juzqafwq

juzqafwq2#

这个java代码可以帮助

HTableDescriptor td = new HTableDescriptor(TableName.valueOf("tableName"));
HColumnDescriptor cf = new HColumnDescriptor("cf".getBytes()); 
td.addFamily(cf);

byte[][] splitKeys = new byte[] {key1.getBytes(), key2.getBytes()};    
HBaseAdmin dbAdmin = new HBaseAdmin(conf);
dbAdmin.createTable(td, splitKeys);

相关问题