Scala:创建一个 HBase table,基于行键预分割区域

Scala: Creating a HBase table with pre splitting region based on Row Key

我有三个 RegionServer。我想根据我已经确定的行键(例如,rowkey_100 和 rowkey_200)将 HBase table 均匀分布到三个区域服务器上。它可以从 hbase shell 使用:

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

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

这个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);

下面是用于创建带拆分的 HBase table 的 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)