hbase 如何选择预拆分策略及其如何影响您的行键

hbase how to choose pre split strategies and how its affect your rowkeys

我正在尝试预拆分 hbase table。其中一个 HbaseAdmin java api 是创建一个 hbase table 是 startkey、endkey 和区域数量的函数。这是我从 HbaseAdmin void createTable(HTableDescriptor desc, byte[] startKey, byte[] endKey, int numRegions)

使用的 java api

有没有根据数据集选择startkey和endkey的推荐?

我的方法是假设我们在数据集中有 100 条记录。我希望数据大约分为 10 个区域,因此每个区域大约有 10 条记录。所以要找到开始键,我会说 scan '/mytable', {LIMIT => 10} 并选择最后一个行键作为我的开始键,然后 scan '/mytable', {LIMIT => 90} 并选择最后一个行键作为我的结束键。

这种查找 startkey 和 rowkey 的方法看起来不错还是有更好的做法?

编辑 我尝试了以下方法来预拆分空 table。所有三个都没有按照我使用的方式工作。我想我需要加盐才能获得平等分配。

PS> 我只显示部分区域信息

1)

byte[][] splits = new RegionSplitter.HexStringSplit().split(10);
hBaseAdmin.createTable(tabledescriptor, splits);

这给出了边界如下的区域:

{
    "startkey":"-INFINITY",
    "endkey":"11111111",
    "numberofrows":3628951,
},
{
    "startkey":"11111111",
    "endkey":"22222222",
},
{   
    "startkey":"22222222",
    "endkey":"33333333",
},
{
    "startkey":"33333333",
    "endkey":"44444444",
},
{
    "startkey":"88888888",
    "endkey":"99999999",
},
{
    "startkey":"99999999",
    "endkey":"aaaaaaaa",
},
{
    "startkey":"aaaaaaaa",
    "endkey":"bbbbbbbb",
},
{
    "startkey":"eeeeeeee",
    "endkey":"INFINITY",
}

这是无用的,因为我的行键是像 'deptId|month|roleId|regionId' 这样的复合形式,不符合上述边界。

2)

byte[][] splits = new RegionSplitter.UniformSplit().split(10);
hBaseAdmin.createTable(tabledescriptor, splits)

这有同样的问题:

{
    "startkey":"-INFINITY",
    "endkey":"\x19\x99\x99\x99\x99\x99\x99\x99",
}
{
    "startkey":"\x19\x99\x99\x99\x99\x99\x99\
    "endkey":"33333332",
}
{
    "startkey":"33333332",
    "endkey":"L\xCC\xCC\xCC\xCC\xCC\xCC\xCB",
}
{
    "startkey":"\xE6ffffffa",
    "endkey":"INFINITY",
}

3) 我尝试提供开始键和结束键,但得到了以下无用区域。

hBaseAdmin.createTable(tabledescriptor, Bytes.toBytes("04120|200808|805|1999"),
                               Bytes.toBytes("01253|201501|805|1999"), 10);
{
    "startkey":"-INFINITY",
    "endkey":"04120|200808|805|1999",
}
{
    "startkey":"04120|200808|805|1999",
    "endkey":"000PTP\xDC200W\xD07\x9C805|1999",
}
{
    "startkey":"000PTP\xDC200W\xD07\x9C805|1999",
    "endkey":"000ptq<200wp6\xBC805|1999",
}
{
    "startkey":"001\x11\x15\x13\x1C201\x15\x902\x5C805|1999",
    "endkey":"01253|201501|805|1999",
}
{
    "startkey":"01253|201501|805|1999",
    "endkey":"INFINITY",
}

第一个问题:根据我使用 hbase 的经验,我不知道使用开始键和结束键创建区域数量的任何硬性规则。

但根本的是,

With your rowkey design, data should be distributed across the regions and not hotspotted (36.1. Hotspotting)

但是,如果你定义固定数量的区域,如你所说的10个。在大量数据加载后可能不会有10个。如果达到一定限度,区域数量将再次分裂。

In your way of creating table with hbase admin documentation says,创建具有指定区域数的新 table。指定的开始键将成为table的第一个区域的结束键,指定的结束键将成为table的最后一个区域的开始键(第一个区域的开始为空键,最后一个区域有一个空结束键)。

此外,我更喜欢通过脚本创建一个 table,预拆分为 0-10,我将设计一个 rowkey,使其加盐,并将位于其中一个区域服务器上,以避免热点。 喜欢

编辑: If you want to implement own regionSplit 您可以实施并提供自己的实施 org.apache.hadoop.hbase.util.RegionSplitter.SplitAlgorithm 并覆盖

public byte[][] split(int numberOfSplits)

第二个问题: 我的理解 : 你想在特定的table中找到插入数据的startrowkey和end rowkey...下面是方法。

  • 如果你想找到起始行键和结束行键scan '.meta' table来了解你的起始行键和结束行键..

  • 如果您能看到行键在每个区域的分布情况,您可以访问 uihttp://hbasemaster:60010。对于每个区域,开始和行键都将在那里。

  • 要知道你的密钥是如何组织的,在预拆分你的 table 并插入到 hbase 之后......使用 FirstKeyOnlyFilter

例如:scan 'yourtablename', FILTER => 'FirstKeyOnlyFilter()' 显示所有 100 个行键。

如果您有大量数据(不是您提到的 100 行)并且想要转储所有行键,那么您可以从外部使用下面 shell..

echo "scan 'yourtablename', FILTER => 'FirstKeyOnlyFilter()'" | hbase shell > rowkeys.txt