Java HBase MapReduce-基于行键拆分区域

Java HBase MapReduce-基于行键拆分区域,java,hadoop,mapreduce,hbase,Java,Hadoop,Mapreduce,Hbase,我正在针对hbase集群运行java mapreduce 行键的形式为UUID yyyymmdd UUID,行组将共用第一个UUID(行键前缀)。我将这些带有共享前缀的行称为组 在我们的hbase集群中,有些组包含的数据比其他组多得多。一个群体的规模可能只有几千人,也可能超过一百万人 据我所知,一个绘图员将读取一个区域 这意味着包含较大组的区域将被分配给单个映射器,因此该映射器将处理大量数据 我已经阅读并测试了将hbase.hregion.max.filesize参数设置得更低,以便分区。这确实

我正在针对hbase集群运行java mapreduce

行键的形式为UUID yyyymmdd UUID,行组将共用第一个UUID(行键前缀)。我将这些带有共享前缀的行称为组

在我们的hbase集群中,有些组包含的数据比其他组多得多。一个群体的规模可能只有几千人,也可能超过一百万人

据我所知,一个绘图员将读取一个区域

这意味着包含较大组的区域将被分配给单个映射器,因此该映射器将处理大量数据

我已经阅读并测试了将hbase.hregion.max.filesize参数设置得更低,以便分区。这确实提高了mapreduce作业的性能,因为会编组更多的映射程序来处理相同的数据

但是,将此全局最大值参数设置得较低也会导致更多的数百或数千个区域,这会引入其自身的开销,因此不建议这样做

现在我的问题是:

是否可以基于行键前缀分割区域,而不是应用全局最大值? 这样,如果一个大群体达到一定规模,它可能会蔓延到另一个地区。但较小的群体可以留在一个区域内,并尽可能将区域总数保持在较低水平

希望这有意义!
谢谢。

在HBase中创建表时,如果您事先知道“有问题”的键前缀,您可以通过在您的情况下提供键(即范围)列表,以任何方式拆分它 下面是scala中的一个简单示例,但在Java中几乎相同(除了一些样板代码:)

private val admin=new HBaseAdmin(配置)
如果(!admin.tableExists(tableName))createTable()
私有def createTable(){
val htd=新的HTableDescriptor(表名)
val hcd=新的HColumnDescriptor(TableHandler.FAMILY)
hcd.setMaxVersions(1)
htd.addFamily(hcd)
admin.createTable(htd、calcSplits)//
  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
  }