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

Hbase 时间序列数据如何在集群中均匀分布?,hbase,Hbase,我将HBase表的行键设计如下: <clustering-prefix><yyyyMMdd><type><uid> 考虑到数据是时间序列的,这允许以相当好的性能并行地将负载发送到100个区域 不幸的是,我注意到许多将在同一天并行填充的区域都由同一个区域服务器托管。例如: 002015010 -> region_server_01 * 012015010 -> region_server_02 022015010 -> regio

我将HBase表的行键设计如下:

<clustering-prefix><yyyyMMdd><type><uid>
考虑到数据是时间序列的,这允许以相当好的性能并行地将负载发送到100个区域

不幸的是,我注意到许多将在同一天并行填充的区域都由同一个区域服务器托管。例如:

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_文件中更改区域分割的顺序,但行为没有改变

此类行的原因与读写要求有关:

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

有没有办法配置HBase AssignmentManager?为不同的区域服务器分配不同的群集前缀


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

设置拆分时仅使用salt:

create 't1', 'f1', {SPLITS => ['01', '02', '03', '04' ... '99']}
以00开头的行键。。。。将被分配到区域1

以01开头的行键。。。。将被分配到区域2

以02开头的行键。。。。将被分配到区域3

等等。。。HBase负载平衡器将根据分配给每台服务器的区域负载数量,负责区域服务器之间的区域分布


顺便说一句,您的示例有9个字符,根据您所说的,salt的字符数应该是10 2,date的字符数应该是8。

是的,我试图遵循每个服务器100-200个区域的规则,并且我在拆分中包含了一些日期字符。我没有包括完整日期,因为它会产生比需要更多的区域,所以我在同一区域中为每个salting-prefix仅使用前7个字符(大约10天)。在我的情况下,仅使用salting-prefix作为split有点限制,因为在批读取数据时,它将仅从集群的一个区域读取。我还需要按日期的一部分进行分配。每个插入行的satting前缀应该是一个随机数,以确保在服务器上分布的区域之间均匀分布,如果需要更多区域,只需创建一个更大的前缀,即:000到999,甚至0000到9999。请描述您在写入数据时如何生成salt前缀以及您的读取模式。您对salt前缀的看法是正确的,因此我将名称更改为clustering prefix,因为在这种情况下,值不是随机的更合适。我还添加了关于读写路径的信息。现在更清楚了,所以,您希望在不失去进行部分扫描的能力的情况下确保最大的分发。。。遗憾的是,这是不可能的。当数据跨区域分布时,您将需要执行全表扫描,但您可以使用有利于您的列族和时间范围来减少扫描的数据量,使用适当数量的RegionServer和良好的分布,这应该不会是一个问题。对于您的问题,确实没有理想的解决方案,这主要取决于您的模式、扫描的常见日期范围、不同事件类型的数量。。。祝你好运
create 't1', 'f1', {SPLITS => ['01', '02', '03', '04' ... '99']}