gpt4 book ai didi

java - HBase MapReduce - 基于 rowkey 分割区域

转载 作者:行者123 更新时间:2023-12-01 14:06:57 25 4
gpt4 key购买 nike

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

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

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

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

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

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

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

现在回答我的问题:

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

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

最佳答案

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

关于java - HBase MapReduce - 基于 rowkey 分割区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18834261/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com