2017-02-20 34 views
0

我有三個RegionServers。我想根據我已經識別的rowkeys(比如rowkey_100和rowkey_200)將HBase表平均分配到三個regionservres上。它可以從HBase的外殼使用來完成:Scala:根據Row鍵創建一個具有預分割區域的HBase表

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

如果我沒有記錯的話,這2個分割點將創建3個地區,以及前100行必去的第一個RegionServer的,下一個100行會在第2區域服務器和最後一個區域服務器中的其餘行。我想用scala代碼做同樣的事情。我如何在scala代碼中指定它來將表拆分成區域?

回答

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 = ...線並更換createTablesplits參數與autoSplits(2)autoSplits(4, 128)

+0

謝謝Leo的回覆。 –

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); 
+0

亞當感謝你的答案。 –

相關問題