Hbase 建立分區表 By Scala

問題描述:

Hbase在大規模數據數據集情況下拉取數據時,若rowkey密集集中在一臺節點,則在批量拉取數據時容易出現數據拉取速度很慢或者出現timeout,如果資源允許的情況下,可以將rowkey根據自己的規則手動split到多個分區中,從而把rowkey均勻打到多臺服務器,這樣在數據獲取時就不會因爲rowkey集中而對單臺hbase服務器壓力過大導致超時影響任務執行。

 

Hbase rowKey 

先看一下寫入hbase的基本語法與addColumn源碼。put方法,這裏第一行即爲我們傳入的rowKey,通過addColumn方法分別添加列簇famliy,標識qualifier還有值value。這裏只需要知道split分區需要用到的rowKey就是我們put方法寫入Hbase表的rowKey。

val put: Put = new Put(Bytes.toBytes(rowKey))
put.addColumn(Bytes.toBytes(aaa), Bytes.toBytes(bbb), Bytes.toBytes(ccc))
public Put addColumn(byte[] family, byte[] qualifier, byte[] value) {
    return this.addColumn(family, qualifier, this.ts, value);
}

 

Hbase 建立分區表

首先根據自己的Hbase服務器調用HbaseConfiguration配置好quorum,port等參數,然後建立連接獲取admin,在建表時加入splitKeys即可。

1)這裏splitkeys是基於先驗信息得到的,即你已經對自己寫入Hbase表中的rowkey分佈有大致瞭解,如果還不瞭解,可以事先隨機採樣一部分做等距或等分佈的方法找到合適的劃分區間作爲自己分區劃分的依據

2)由於hbase是基於byte來操作,所以相應的splitkeys需要轉換爲字節的形式

3)建表完成後,put數據進去後就會根據splitkeys與相應的quorum配置,均勻的打到各臺hbase服務器上

  def getHbaseRegion(tableName: String): Unit ={
    val zookeeper_quorum = "quorum"
    val zookeeper_port = "port"
    val zookeeper_sava_path = "sava_path"

    val conf = HBaseConfiguration.create()
    conf.set("hbase.zookeeper.quorum", zookeeper_quorum)
    conf.set("hbase.zookeeper.property.clientPort", zookeeper_port)
    conf.set("zookeeper.znode.parent", zookeeper_sava_path)
    
    val connection: Connection = ConnectionFactory.createConnection(conf)
    var admin: HBaseAdmin = connection.getAdmin.asInstanceOf[HBaseAdmin]

    val splitKesy = Array(2, 4, 6, 8).map(Bytes.toBytes(_))

    if (admin.tableExists(tableName)){
      println("Warning: table is already exists")
    }
    val tName = valueOf(tableName)
    //創建Hbase表模式
    val descriptor = new HTableDescriptor(tName)
    descriptor.addFamily(new HColumnDescriptor("cf"))
    //創建表
    admin.createTable(descriptor,splitKesy)
  }

 

結果

分區並put數據得到新的分區表,可以看到rowkey的分佈很均勻,再次拉取數據未出現超時的情況發生。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章