首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在hbase中进行预拆分

如何在hbase中进行预拆分
EN

Stack Overflow用户
提问于 2015-01-27 16:11:36
回答 3查看 16.4K关注 0票数 11

我将数据存储在有5个区域服务器的hbase中。我使用url的md5散列作为我的行键。目前,所有数据都只存储在一个区域服务器中。所以我想要对地域进行预分割,让数据在所有地域服务器上统一传输,这样数据就可以在每个地域服务器上统一传输。我想拆分数据,因为行的第一个字符key.As第一个字符是从0到f(16个字符)。像rowkey从0开始到3的数据将放在第一个区域服务器中,3-6在第二个区域服务器上,6-9在第三个区域服务器上,a-d在第四个区域服务器上,d-f在第五个区域服务器上。我该怎么做呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-01-27 17:13:19

您可以在创建表时提供拆分特性。

代码语言:javascript
复制
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()的调用中相对均匀地接收卸载区域。该算法目前是这样实现的:

  1. 确定每个服务器应该拥有的两个有效区域数,MIN=floor(average)和MIN=floor down是负载最大的服务器,从每个服务器中剥离区域,以便每个服务器都托管最大区域。一旦到达已经有<= MAX区域的服务器,就停止。对区域进行排序,以从最新的服务器向下移动到负载最小的服务器,分配区域,以便每个服务器都恰好具有最小区域。一旦到达已经有>=最小区域的服务器,就停止。分配给负载不足的服务器的区域是在上一步中被剥离的区域。可能没有足够的区域将每个负载不足的服务器填充到最低负载。如果是这样的话,我们最终会得到一些需要这样做的区域,neededRegions。也有可能的是,我们能够填充每个负载不足的区域,但最终得到的区域是从过载的服务器中卸载的,但仍然没有分配。如果这两个条件都不成立(不需要区域来填充负载不足的服务器,没有区域从过载的服务器中剩余),我们就完成并返回。否则我们将在下面处理这些情况。
  2. 如果neededRegions非零(仍然有负载不足的服务器),我们再次迭代负载最高的服务器,从每个服务器中剥离一个服务器(这会使它们从最大区域减少到最小区域)。
  3. 我们现在肯定有更多的区域需要分配,无论是从上一步还是从过载服务器的原始脱落。迭代负载最低的服务器,将每个服务器填充到最小。如果我们仍然有更多的区域需要分配,再次迭代负载最小的服务器,这次给每个服务器(将它们填充到MAX),直到我们用完为止。
  4. 所有服务器现在将托管最小或最大区域。此外,任何托管>=最大区域的服务器都保证在平衡结束时以最大区域结束。这可确保尽可能少的区域被移动。

TODO:我们至多可以将远离特定服务器的区域数量重新分配为它们报告的负载最大的区域数量。我们应该把所有的赋值都保存在内存中吗?有什么反对意见吗?这是否意味着我们需要在HMaster上使用HeapSize?或者只是细心的监视器?(目前的想法是我们将把所有的赋值都保存在内存中)

票数 15
EN

Stack Overflow用户

发布于 2015-01-29 01:43:11

如果您已经存储了所有数据,我建议您使用hbase shell手动将一些区域服务器移动到另一个区域服务器。

代码语言:javascript
复制
hbase> move ‘ENCODED_REGIONNAME’, ‘SERVER_NAME’

移动一个区域。可以选择指定目标区域服务器,否则我们会随机选择一个。注意:您传递的是编码的区域名称,而不是区域名称,因此此命令与其他命令略有不同。编码的区域名称是区域名称的散列后缀:例如,如果区域名称为TestTable,0094429456,1289497600452.527db22f95c8a9e0116f0cc13c680396.则编码区域名称部分为527db22f95c8a9e0116f0cc13c680396服务器名称是其主机、端口和起始代码。例如: host187.example.com,60020,1289493121758

票数 4
EN

Stack Overflow用户

发布于 2016-05-16 22:11:19

如果使用Apache Phoenix在HBase中创建表,可以在CREATE语句中指定SALT_BUCKETS。该表将被拆分成与存储桶中提到的一样多的区域。Phoenix计算rowkey的散列(很可能是一个数字散列% SALT_BUCKETS),并将列单元格分配给适当的区域。

代码语言:javascript
复制
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允许您相应地拆分区域。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28165833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档