hadoop 如何在HBase中预拆分表

bxfogqkk  于 2022-11-21  发布在  Hadoop
关注(0)|答案(3)|浏览(214)

我在有5个区域服务器的HBase中存储数据。我使用url的md5散列作为我的行键。目前所有的数据都只存储在一个区域服务器中。所以我想预先分割区域,这样数据就可以在所有的区域服务器中均匀分布。我想通过行键的第一个字符将表分割成5个区域。这样行关键字从0到3的数据进入第一个区域服务器,3-6到第二个,7-9到第三个,a-d到第四个,d-f到第五个。我该怎么做?

vd2z7a6w

vd2z7a6w1#

您可以在建立表格时提供SPLITS性质。

  1. create 'tableName', 'cf1', {SPLITS => ['3','6','9','d']}

4个分割点将生成5个区域。
请注意,HBase的DefaultLoadBalancer并不保证区域服务器之间100%均匀分布,可能会发生区域服务器托管同一表中的多个区域的情况。
有关其工作原理的更多信息,请查看:

  1. public List<RegionPlan> balanceCluster(Map<ServerName,List<HRegionInfo>> clusterState)

根据服务器信息到每个服务器的负载最大区域的指定Map生成全局负载平衡计划。负载平衡不变条件是所有服务器都在每个服务器的平均区域数的1个区域内。如果平均值是整数,则所有服务器都将平衡到平均值。否则,所有服务器都有一层(平均)或上限HBASE-3609 Modeled regions ToMove使用Guava的MinMaxPriorityQueue以便我们可以从队列的两端进行提取。在开始时,我们检查是否有空的区域服务器刚被主服务器发现。如果是,我们分别从regionsToMove的头/尾交替选择新/旧区域。这种交替避免了在新发现的区域服务器上聚集年轻的区域。否则,我们从regionsToMove的头部选择新的区域。HBASE-3609的另一个改进是我们以循环方式将regionsToMove中的区域分配给负载不足的服务器。以前,在我们移动到下一个负载不足的服务器之前,一个负载不足的服务器将被填满,从而导致年轻区域的聚类。最后,我们随机地对负载不足的服务器进行洗牌,以便它们在调用balanceCluster()时相对均匀地接收卸载区域。
1.确定每个服务器应具有的两个有效区域数,MIN=floor(平均值),MAX=ceiling(平均值)。
1.向下迭代负载最大的服务器,从每个服务器中剥离区域,以便每个服务器正好承载MAX个区域。当到达已经具有〈= MAX个区域的服务器时停止。将区域排序为从最新到最少。
1.向下迭代负载最小的服务器,分配区域,使每个服务器正好有MIN个区域。当你到达一个已经有〉= MIN个区域的服务器时停止。分配给负载不足的服务器的区域是在上一步中被剥离的区域。有可能没有足够的区域被剥离来填充每个负载不足的服务器到MIN。如果是这样,我们最终得到了这样做所需的区域数量。neededRegions。也有可能我们能够填充每个欠载的服务器,但最终得到的区域未从过载的服务器分配,但仍然没有分配。如果这两个条件都不成立(不需要填充欠载的服务器的区域,过载的服务器没有剩余的区域),我们就完成并返回。否则,我们将在下面处理这些情况。
1.如果neededRegions不为零(仍然有负载不足的服务器),我们再次迭代负载最大的服务器,从每个服务器中去掉一个服务器(这使它们从具有MAX区域变为具有MIN区域)。
1.我们现在肯定有更多的区域需要分配,无论是从上一步还是从最初的过载服务器中剥离出来的。迭代负载最小的服务器,将每个服务器填充到MIN。如果我们还有更多的区域需要分配,再次迭代负载最小的服务器,这次给每个服务器(将它们填充到MAX),直到我们用完为止。
1.所有服务器现在将托管MIN或MAX区域。另外,任何托管〉= MAX区域的服务器保证在平衡结束时以MAX区域结束。这确保了尽可能少的区域被移动。
TODO:我们最多可以重新分配远离特定服务器的区域数,使其等于它们报告为负载最大的区域数。我们是否应该将所有分配都保留在内存中?是否有异议?这是否意味着我们需要HMaster上的HeapSize?或者只是仔细监视?(当前的想法是我们将所有分配都保留在内存中)

展开查看全部
sh7euo9m

sh7euo9m2#

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

  1. hbase> move ENCODED_REGIONNAME’, SERVER_NAME

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

laximzn5

laximzn53#

如果您使用Apache Phoenix在HBase中创建表,则可以在CREATE语句中指定SALT_BUCKETS。该表将拆分为与所述存储桶一样多的区域。Phoenix会计算行关键字的散列(最有可能是数字散列% SALT_BUCKETS),并将列单元格分配给相应的区域。

  1. CREATE TABLE IF NOT EXISTS us_population (
  2. state CHAR(2) NOT NULL,
  3. city VARCHAR NOT NULL,
  4. population BIGINT
  5. CONSTRAINT my_pk PRIMARY KEY (state, city)) SALT_BUCKETS=3;

这会将表预拆分为3个区域
或者,HBase默认UI允许您相应地拆分区域。

相关问题