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
我正在尝试预拆分 hbase table。其中一个 HbaseAdmin java api 是创建一个 hbase table 是 startkey、endkey 和区域数量的函数。这是我从 HbaseAdmin void createTable(HTableDescriptor desc, byte[] startKey, byte[] endKey, int numRegions)
有没有根据数据集选择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