【问题标题】:HBase MapReduce - Splitting a region based on rowkeyHBase MapReduce - 根据行键分割区域
【发布时间】:2013-09-16 17:52:22
【问题描述】:

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

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

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

据我了解,一个区域将由一个映射器读取。

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

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

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

现在我的问题:

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

希望这是有道理的! 谢谢。

【问题讨论】:

    标签: java hadoop mapreduce hbase


    【解决方案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 拆分方法来拆分特定区域

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-21
      • 2020-01-06
      • 2011-12-14
      • 1970-01-01
      相关资源
      最近更新 更多