hbase如何选择预拆分策略以及它如何影响你的rowkeys

时间:2016-06-02 03:41:24

标签: java hadoop hbase

我正在尝试预先拆分hbase表。一个HbaseAdmin java api是创建一个hbase表,它是startkey,endkey和多个区域的功能。这是我在HbaseAdmin void createTable(HTableDescriptor desc, byte[] startKey, byte[] endKey, int numRegions)

中使用的java api

是否有关于根据数据集选择startkey和endkey的建议?

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

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

修改 我尝试了以下方法来预拆分空表。 ALl三没有按照我使用它的方式工作。我想我需要加强关键以获得平等分配。

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",
}

这是没用的,因为我的rowkeys是复合形式,如'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",
}

1 个答案:

答案 0 :(得分:4)

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

但潜在的事情是,

  

使用rowkey design,数据应分布在各个区域,而不是热点   (36.1. Hotspotting

但是,如果您按照提到的那样定义了固定数量的区域10.加载大量数据后可能不会有10个。如果达到,某个限制,区域数量将再次分裂。

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

此外,我更喜欢通过脚本创建一个表,其中presplits说0-10,我将设计一个rowkey,使其成为salted,它将位于一个区域服务器上,以避免热点。 比如enter image description here

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

public byte[][] split(int numberOfSplits)

第二个问题: 我的理解 : 您希望在特定表中找到插入数据的startrowkey和end rowkey ...以下是方法。

  • 如果要查找开始和结束rowkeys scan '.meta'表,了解如何启动rowkey和结束rowkey ..

  • 如果你能看到rowkeys如何分布在每个区域,你可以访问ui http://hbasemaster:60010。对于每个区域的开始和rowkeys将在那里。

  • 了解您的密钥的组织方式,预分割表格并插入hbase后...使用FirstKeyOnlyFilter

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

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

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