Hadoop 如何在hbase中预拆分

Hadoop 如何在hbase中预拆分,hadoop,hbase,Hadoop,Hbase,我将数据存储在具有5个区域服务器的hbase中。我正在使用url的md5哈希作为我的行键。目前,所有数据仅存储在一个区域服务器中。所以我想预先分割区域,这样数据将统一地分布在所有区域服务器上,这样数据将统一地分布在每个区域服务器上。 我想将数据拆分为行键的第一个字符。因为第一个字符是从0到f(16个字符)。与rowkey从0到3的数据一样,数据将进入第1个区域服务器,第2个区域服务器为3-6,第3个区域服务器为6-9,第4个区域服务器为a-d,第5个区域服务器为d-f。如何操作?您可以在创建表时

我将数据存储在具有5个区域服务器的hbase中。我正在使用url的md5哈希作为我的行键。目前,所有数据仅存储在一个区域服务器中。所以我想预先分割区域,这样数据将统一地分布在所有区域服务器上,这样数据将统一地分布在每个区域服务器上。
我想将数据拆分为行键的第一个字符。因为第一个字符是从0到f(16个字符)。与rowkey从0到3的数据一样,数据将进入第1个区域服务器,第2个区域服务器为3-6,第3个区域服务器为6-9,第4个区域服务器为a-d,第5个区域服务器为d-f。如何操作?

您可以在创建表时提供SPLITS属性

create 'tableName', 'cf1', {SPLITS => ['3','6','9','d']}
4个分割点将生成5个区域

请注意,HBase不能保证区域服务器之间的分布100%均匀,一个区域服务器可能承载同一个表中的多个区域

有关其工作原理的更多信息,请参阅:

公共列表平衡群集(映射群集状态)
根据指定的映射生成全局负载平衡计划 将服务器信息复制到每台服务器负载最多的区域。这个 负载平衡不变量是所有服务器都在 每个服务器的平均区域数。如果平均值是整数 数量,所有服务器将平衡到平均水平。否则,所有 服务器将具有地板(平均)或天花板(平均)区域。 HBASE-3609使用Guava的MinMaxPriorityQueue so对区域进行建模 我们可以从队列的两端获取。一开始,我们 检查主服务器是否发现了空区域服务器。 如果是这样的话,我们交替地从图像的头部/尾部选择新的/旧的区域 分别是RegionTomove。这种交替避免了集群 新发现的区域服务器上的区域。否则,我们选择 来自区域负责人Tomove的新区域。另一个改进来自 HBASE-3609是我们从regionsToMove到Underload分配的区域 以循环方式运行服务器。以前是一台负载不足的服务器 将在我们移动到下一个负载不足的服务器之前填充, 导致年轻地区的聚集。最后,我们随机洗牌 服务器负载不足,因此它们可以相对地接收卸载的区域 在对balanceCluster()的调用中均匀分布。该算法目前正在运行 实施如下:

  • 确定每个服务器应具有的两个有效区域数,最小值=地板(平均值)和最大值=天花板(平均值)
  • 遍历负载最多的服务器,从每个服务器中删除区域,以便每个服务器承载的区域正好最大。到达服务器后停止 已经有=MIN个区域。正在指定给欠载的区域 服务器是在上一步中丢弃的服务器。这是可能的 没有足够的区域来填充每个欠载区域 服务器到最小值。如果是这样的话,我们最终会得到一些需要执行的区域 所以,需要区域。我们也有可能填补每一个空缺 加载不足,但最终导致区域未从中分配 过载的服务器,但仍然没有分配。如果两者都没有 这些条件中的一个保持不变(无需填充欠载区域 服务器,没有过载服务器遗留的区域),我们已经完成了 返回。否则,我们将在下面处理这些情况
  • 如果neededRegions为非零(仍然有负载不足的服务器),我们将再次迭代负载最多的服务器,从中删除单个服务器 每个(这使它们从最大区域变为最小区域)
  • 我们现在肯定有更多的地区需要分配,无论是从上一步还是从最初的摆脱超载 服务器。迭代加载最少的服务器,将每个服务器填充到最小值 仍然有更多需要分配的区域,再次迭代最少的区域 已加载的服务器,这一次给每个服务器(将其填充到最大值),直到 我们用完了
  • 所有服务器现在都将承载最小或最大区域。此外,任何托管>=MAX区域的服务器都保证以MAX结束 平衡结束时的区域。这确保了最小的数量 所有可能的区域都已移动
  • TODO:我们最多可以将区域数重新分配给一个 特定服务器是指它们报告为最多加载的服务器数。我们应该吗 把所有的作业都记在记忆里?有反对意见吗?这是否意味着我们 需要在HMaster上进行治疗吗?还是只是仔细监视?(当前的想法) 我们将在内存中保存所有作业)


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

    移动一个区域。(可选)指定我们选择的目标regionserver 随便一个。注意:您传递的是编码的区域名称,而不是区域名称 因此,此命令与其他命令略有不同。编码的 区域名称是区域名称上的哈希后缀:例如,如果区域 名字是 测试表,00944294561289497600452.527db22f95c8a9e0116f0cc13c680396。 然后,编码的区域名称部分是 527db22f95c8a9e0116f0cc13c680396服务器名是其主机,端口号为plus startcode。例如:host187.example.com,600201289493121758


    如果使用ApachePhoenix在HBase中创建表,可以在CREATE语句中指定SALT_bucket。该表将被划分为与bucket所提到的一样多的区域。Phoenix计算rowkey的散列(最有可能是数值散列%SALT_bucket),并将列单元格分配给适当的区域

    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允许您相应地分割区域。

    但如果我在创建表时进行预拆分,则可以保证它将在不同的区域服务器中分别创建5个区域。对吗?它将创建5个区域,但是LoadBalancer将根据每个regionserver的负载(分配的区域数)来分配它们,一个regionserver可能会获得tw
    hbase> move ‘ENCODED_REGIONNAME’, ‘SERVER_NAME’
    
    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;