我正在尝试预先拆分hbase表。一个HbaseAdmin java api是创建一个hbase表,它是startkey,endkey和多个区域的功能。这是我在HbaseAdmin void createTable(HTableDescriptor desc, byte[] startKey, byte[] endKey, int numRegions)
是否有关于根据数据集选择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",
}
答案 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,它将位于一个区域服务器上,以避免热点。 比如
编辑: 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