时间序列数据如何在整个群集中均匀分布?

时间:2015-01-13 13:36:22

标签: hbase

我按如下方式设计了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 中区域拆分的顺序,但行为没有改变。

这种行的原因与读写要求有关:

  • :具有不同群集前缀的一天事件将在到达时同时写入
  • 读取:经过一段时间后,日期范围内收到的具有相同群集前缀的事件应由Spark作业批量处理

问题

有没有办法配置HBase(AssignmentManager?)为不同的区域服务器分配不同的聚类前缀?

默认情况下,分配过程的行为是随机的。

1 个答案:

答案 0 :(得分:0)

设置分割时仅使用salt:

create 't1', 'f1', {SPLITS => ['01', '02', '03', '04' ... '99']}

以00 ....开头的Rowkeys将被分配到区域1

以01 ....开头的Rowkeys将被分配到区域2

以02 ....开头的Rowkeys将被分配到区域3

等等...... HBase负载均衡器将负责区域服务器的区域分布,具体取决于负载(分配给每个服务器的区域数量)


顺便说一下,根据你所说的,你的例子有9个字符,它们应该是10(盐为2 +日期为8)。