我按如下方式设计了HBase表的行键:
<clustering-prefix><yyyyMMdd><type><uid>
其中 clustering-prefix 是一个两位数的字符串,允许我通过将事件分组到集群中,将一天的负载分散到整个集群中。
我还使用 SPLITS_FILE 子句创建了表,其中包含以下拆分序列:
002015010
012015010
022015010
032015010
042015010
...
992015010
012015011
022015011
...
考虑到数据是时间序列,这允许并行地向100个区域发送负载,性能相当好。
不幸的是,我注意到许多将要并行填充的区域( day 部分是相同的)由同一个区域服务器托管。也就是说,例如:
002015010 -> region_server_01 *
012015010 -> region_server_02
022015010 -> region_server_01 *
032015010 -> region_server_06 **
042015010 -> region_server_03
052015010 -> region_server_01 *
062015010 -> region_server_06 **
理想情况下,如果我有100个区域服务器,我想以这样的方式分配区域,即具有不同聚类前缀(前两个数字)的区域尽可能由不同的区域服务器托管。
我尝试更改 SPLITS_FILE 中区域拆分的顺序,但行为没有改变。
这种行的原因与读写要求有关:
问题
有没有办法配置HBase(AssignmentManager?)为不同的区域服务器分配不同的聚类前缀?
默认情况下,分配过程的行为是随机的。
答案 0 :(得分:0)
设置分割时仅使用salt:
create 't1', 'f1', {SPLITS => ['01', '02', '03', '04' ... '99']}
以00 ....开头的Rowkeys将被分配到区域1
以01 ....开头的Rowkeys将被分配到区域2
以02 ....开头的Rowkeys将被分配到区域3
等等...... HBase负载均衡器将负责区域服务器的区域分布,具体取决于负载(分配给每个服务器的区域数量)