我有三个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代码中指定这个以将表拆分为区域?
答案 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}}参数替换为splits
或autoSplits(2)
等。