【问题标题】:Scala: Creating a HBase table with pre splitting region based on Row KeyScala:基于 Row Key 创建具有预分割区域的 HBase 表
【发布时间】:2017-07-09 04:15:34
【问题描述】:

我有三个 RegionServer。我想根据我已经确定的行键(例如,rowkey_100 和 rowkey_200)将 HBase 表均匀分布到三个 regionservres。可以从 hbase shell 使用:

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

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

【问题讨论】:

    标签: scala apache-spark hbase hadoop2


    【解决方案1】:

    以下是用于创建具有拆分的 HBase 表的 Scala sn-p:

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

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

    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)等即可。

    【讨论】:

    • 感谢 Leo 的回复。
    【解决方案2】:

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

    【讨论】:

    • 感谢亚当的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多