hbase mapreduce-基于rowkey拆分区域

62lalag4  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(268)

我正在hbase集群上运行javamapreduce。
行键的格式为uuid yyymmdd uuid,行组将共用第一个uuid(行键前缀)。我将这些带有共享前缀的行称为组。
在我们的hbase集群中,有些组包含的数据比其他组多得多。一个群体的规模可能只有几千人,也可能超过一百万。
据我所知,一个Map绘制者将读取一个区域。
这意味着包含较大组的区域将被分配给单个Map器,因此该Map器将处理大量数据。
我已经阅读并测试了如何将hbase.hregion.max.filesize参数设置得更低,以便分割区域。这确实提高了mapreduce作业的性能,因为需要封送更多的Map程序来处理相同的数据。
但是,将此全局最大值参数设置得较低也会导致更多的数百或数千个区域,这会引入自己的开销,因此不建议这样做。
现在我的问题是:
是否可以基于rowkey前缀拆分区域,而不是应用全局max?这样,如果一个大的群体达到一定的规模,它可能会蔓延到另一个地区。但较小的群体可以保持在一个区域内,并尽可能地将区域的总数保持在较低的水平。
希望这有意义!谢谢。

mitkmikd

mitkmikd1#

当您在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 split方法来分割特定区域

相关问题