我将数据存储在有5个区域服务器的hbase中。我使用url的md5散列作为我的行键。目前,所有数据都只存储在一个区域服务器中。所以我想要对地域进行预分割,让数据在所有地域服务器上统一传输,这样数据就可以在每个地域服务器上统一传输。我想拆分数据,因为行的第一个字符key.As第一个字符是从0到f(16个字符)。像rowkey从0开始到3的数据将放在第一个区域服务器中,3-6在第二个区域服务器上,6-9在第三个区域服务器上,a-d在第四个区域服务器上,d-f在第五个区域服务器上。我该怎么做呢?
发布于 2015-01-27 17:13:19
您可以在创建表时提供拆分特性。
create 'tableName', 'cf1', {SPLITS => ['3','6','9','d']}这4个拆分点将生成5个区域。
请注意,HBase的DefaultLoadBalancer不保证区域服务器之间100%均匀分布,区域服务器可能会托管同一表中的多个区域。
有关它的工作原理的更多信息,请查看this
公用列表balanceCluster(Map clusterState)
根据指定的服务器信息映射到每个服务器负载最高的区域,生成全局负载均衡计划。负载平衡不变量是所有服务器都在每个服务器平均区域数的1个区域内。如果平均值是整数,则所有服务器都将平衡到平均值。否则,所有服务器将具有地板(平均)或天花板(平均)区域。HBASE-3609使用Guava的MinMaxPriorityQueue对regionsToMove建模,这样我们就可以从队列的两端获取数据。首先检查Master刚刚发现的地域服务器是否为空。如果是,我们将分别从regionsToMove的头部/尾部交替选择新区域/旧区域。此交替操作可避免在新发现的区域服务器上对年轻区域进行群集。否则,我们从regionsToMove的头中选择新的区域。HBASE-3609的另一个改进是,我们以循环方式将regionsToMove中的区域分配给负载不足的服务器。以前,在我们转移到下一个负载不足的服务器之前,一个负载不足的服务器会被填满,导致年轻区域的集群。最后,我们随机打乱负载不足的服务器,以便它们在对balanceCluster()的调用中相对均匀地接收卸载区域。该算法目前是这样实现的:
TODO:我们至多可以将远离特定服务器的区域数量重新分配为它们报告的负载最大的区域数量。我们应该把所有的赋值都保存在内存中吗?有什么反对意见吗?这是否意味着我们需要在HMaster上使用HeapSize?或者只是细心的监视器?(目前的想法是我们将把所有的赋值都保存在内存中)
发布于 2015-01-29 01:43:11
如果您已经存储了所有数据,我建议您使用hbase shell手动将一些区域服务器移动到另一个区域服务器。
hbase> move ‘ENCODED_REGIONNAME’, ‘SERVER_NAME’移动一个区域。可以选择指定目标区域服务器,否则我们会随机选择一个。注意:您传递的是编码的区域名称,而不是区域名称,因此此命令与其他命令略有不同。编码的区域名称是区域名称的散列后缀:例如,如果区域名称为TestTable,0094429456,1289497600452.527db22f95c8a9e0116f0cc13c680396.则编码区域名称部分为527db22f95c8a9e0116f0cc13c680396服务器名称是其主机、端口和起始代码。例如: host187.example.com,60020,1289493121758
发布于 2016-05-16 22:11:19
如果使用Apache Phoenix在HBase中创建表,可以在CREATE语句中指定SALT_BUCKETS。该表将被拆分成与存储桶中提到的一样多的区域。Phoenix计算rowkey的散列(很可能是一个数字散列% SALT_BUCKETS),并将列单元格分配给适当的区域。
CREATE TABLE IF NOT EXISTS us_population (
state CHAR(2) NOT NULL,
city VARCHAR NOT NULL,
population BIGINT
CONSTRAINT my_pk PRIMARY KEY (state, city)) SALT_BUCKETS=3;这将预分割表为3个区域
或者,HBase默认UI允许您相应地拆分区域。

https://stackoverflow.com/questions/28165833
复制相似问题