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