2013-09-16 35 views
0

我對一個hbase集羣運行java mapreduce。HBase MapReduce - 根據rowkey拆分一個區域

行鍵的形式爲UUID-yyyymmdd-UUID,行組將具有共同的第一個UUID(rowkey前綴)。我將使用共享的前綴組來調用這些行。

在我們的hbase集羣中,我們有一些包含比其他更多數據的組。一個團體的規模可能在千人之下,或者可能超過一百萬人。

據我所知,一個區域將被一個映射器讀取。

這意味着包含較大組的區域被分配給一個映射器,因此這個映射器需要處理大量數據。

我已閱讀並測試了將hbase.hregion.max.filesize參數設置得較低,以便區域被拆分。這確實提高了mapreduce作業的性能,因爲更多的mapper被編組來處理相同的數據。

但是,將此全局最大參數設置得更低也可能導致更多數百或數千個區域,這會引入其自己的開銷並且不建議。

現在我的問題:

代替將全球最大的,是有可能基於該rowkey前綴分割的區域? 這樣,如果一個大團體達到一定的大小,它可能會溢出到另一個地區。但是較小的羣體可以保持在一個區域內,並儘可能降低總體區域數量。

希望這是有道理的! 謝謝。

回答

1

當您在HBase中創建表格時,如果您事先知道「有問題」的關鍵字前綴,則可以通過提供列表中的鍵(即範圍)來隨意拆分它。 以下是scala中的一個簡單示例 - 但它是相當多的在Java中相同的(除了一些更多的樣板代碼:))

private val admin=new HBaseAdmin(config) 

    if (!admin.tableExists(tableName)) createTable() 

    private def createTable() { 
    val htd = new HTableDescriptor(tableName) 
    val hcd = new HColumnDescriptor(TableHandler.FAMILY) 


    hcd.setMaxVersions(1) 
    htd.addFamily(hcd) 
    admin.createTable(htd, calcSplits) // <---- create the table with the splits 
    } 

    private def calcSplits = { 
    val splits = new Array[Array[Byte]](256) 
    var i=0 
    for (zones <- 0x00 to 0xff) { 
     val temp =new Array[Byte](1) 
     temp(0)=(0xff & zones).asInstanceOf[Byte] 
     splits(i) = temp 
     i+=1 
    } 
    splits 
    } 

而且,當表已經創造了你可以使用相同的HBaseAdmin分裂的方式,分裂特定區域