Scala:使用基于Row Key的预分割区域创建HBase表

时间:2017-02-20 01:37:34

标签: scala apache-spark hbase hadoop2

我有三个RegionServers。我想基于我已经识别的rowkeys(例如,rowkey_100和rowkey_200)将HBase表均匀分布到三个regionservres上。可以使用以下命令从hbase shell完成:

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

下面是一个Scala片段,用于创建带有分割符的HBase表:

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)
}

有一些预定义的区域拆分策略,但如果您想创建自己的方法来设置跨越您的rowkey范围的拆分点,您可以创建一个简单的函数,如下所示:

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 = ...行,并将createTable的{​​{1}}参数替换为splitsautoSplits(2)等。