我将数据存储在具有5个区域服务器的hbase中。我使用url的md5哈希作为我的行键。目前,所有数据仅存储在一个区域服务器中。所以我想预先拆分区域,以便数据在所有区域服务器上统一分布,这样数据将统一到达每个区域服务器。 我想将数据拆分为行键的第一个字符。第一个字符是从0到f(16个字符)。就像rowkey从0到3开始的数据将在第一个区域服务器中,3-6在第二个,6-9在第3个,a-d在第4个,d-f在第5个。我该怎么办?
答案 0 :(得分:13)
您可以在创建表时提供SPLITS属性。
create 'tableName', 'cf1', {SPLITS => ['3','6','9','d']}
4个分裂点将产生5个区域。
请注意,HBase DefaultLoadBalancer并不能保证区域服务器之间100%均匀分布,区域服务器可能会在同一个表中托管多个区域。
有关其工作原理的详细信息,请查看this:
public List<RegionPlan> balanceCluster(Map<ServerName,List<HRegionInfo>> clusterState)
根据指定的地图生成全局负载平衡计划 服务器信息到每个服务器的最负载区域。该 负载均衡不变量是指所有服务器都在1个区域内 每台服务器的平均区域数。如果平均值是整数 数字,所有服务器将平衡到平均值。否则,全部 服务器将具有楼层(平均)或上限(平均)区域。 HBASE-3609建模区域使用Guava的MinMaxPriorityQueue进行移动 我们可以从队列的两端获取。一开始,我们 检查Master是否发现了空区域服务器。 如果是这样,我们交替选择头/尾的新/旧区域 regionsToMove,分别。这种交替避免了聚集年轻人 新发现的区域服务器上的区域。否则,我们选择 来自地区负责人的新地区ToMove。另一个改进 HBASE-3609是我们将RegionsToMove中的区域分配给欠载 服务器以循环方式。以前一个欠载的服务器 将在我们移动到下一个欠载服务器之前填充, 导致年轻地区聚集。最后,我们随机洗牌 欠载服务器,以便它们相对地接收卸载区域 均匀地调用balanceCluster()。该算法目前 如此实施:
- 确定每个服务器应具有的两个有效区域数,MIN = floor(平均值),MAX = ceiling(平均值)。
- 迭代最多负载的服务器,从每个服务器中删除区域,以便每个服务器都包含MAX区域。到达服务器后停止 已经有&lt; = MAX区域。命令区域从大多数移动 最近至少。
- 迭代负载最少的服务器,分配区域,以便每个服务器都具有完全MIN区域。一旦到达服务器就停止 已经有> = MIN区域。被分配到欠载的区域 服务器是上一步中流出的服务器。有可能的 没有足够的区域来填补每个欠载的区域 服务器到MIN。如果是这样,我们最终需要做一些区域 所以,needRegions。我们也有可能填补每一个 欠载,但结果是未分配的区域 重载服务器,但仍然没有分配。如果没有 这些条件保持不变(没有区域需要填补欠载 服务器,没有超载服务器剩余的区域),我们已经完成了 返回。否则我们会在下面处理这些情况。
- 如果needRegions非零(仍有欠载的服务器),我们再次迭代最多的服务器,从中删除单个服务器 每个(这使他们从MAX区域到MIN区域)。
- 我们现在肯定有更多需要分配的区域,无论是从上一步还是从过载的原始脱落 服务器。迭代最少加载的服务器将每个服务器填充到MIN。要是我们 仍有更多需要分配的区域,再次迭代次数最多 加载服务器,这次给每个服务器(填充它们到MAX)直到 我们用完了。
- 现在所有服务器都将托管MIN或MAX区域。此外,任何托管&gt; = MAX区域的服务器都保证以MAX结尾 平衡结束时的地区。这确保了最小的数量 可能的地区被移动。
醇>TODO:我们最多可以重新分配远离a的区域数量 特定服务器,它们报告的负载最多。我们应该吗 只是将所有作业保留在记忆中?有异议吗?这是否意味着我们 在HMaster上需要HeapSize吗?还是只是仔细监控? (目前的想法 我们将在记忆中保留所有作业吗?
答案 1 :(得分:4)
如果您已经存储了所有数据,我建议您使用hbase shell手动将某些区域移动到其他区域服务器。
hbase> move ‘ENCODED_REGIONNAME’, ‘SERVER_NAME’
移动区域。 (可选)指定我们选择的目标区域服务器 随意一个。注意:您传递编码的区域名称,而不是区域 这个命令与其他命令略有不同。编码 region name是区域名称的哈希后缀:例如如果该地区 名字是 TestTable的,0094429456,1289497600452.527db22f95c8a9e0116f0cc13c680396。 然后编码的区域名称部分是 527db22f95c8a9e0116f0cc13c680396服务器名称是其主机,端口加 起始码。例如:host187.example.com,60020,1289493121758
答案 2 :(得分:1)
如果您使用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个区域