我正在编写一个将RDBMS转换为HBase的程序。我选择了一个顺序实体作为行密钥,如员工ID(1,2,3 ....),但我在某处读取了行键不应该是一个顺序实体。我的问题是为什么不建议选择顺序行键。做同样的设计前景是什么?
答案 0 :(得分:9)
尽管顺序行键允许更快的扫描,但在某一点之后它会成为问题,因为它会在读/写时间内导致不合需要的RegionServer hotspotting
。根据其默认行为,Hbase将具有相似键的行存储到同一区域。它允许更快的范围扫描。因此,如果rowkeys是顺序的,那么所有数据将开始进入同一台机器,导致该机器上的负载不均匀。这称为RegionServer Hotspotting,是不使用顺序键的主要动机。我会采取"写"在这里解释问题。
当将带有顺序键的记录写入HBase时,所有写入都会命中一个区域。如果Region由多个RegionServers提供服务,那么这不会成为问题,但事实并非如此 - 每个Region只存在于一个RegionServer上。每个Region都有一个预定义的最大大小,因此在Region达到该大小后,它将分成两个较小的Region。之后,其中一个新区域将获取所有新记录,然后此Region和为其提供服务的RegionServer成为新的热点受害者。显然,这种不均匀的写入负载分布是非常不合需要的,因为它将写入吞吐量限制为单个服务器的容量,而不是使用HBase集群中的多个/所有节点。
您可以找到问题的非常好的解释及其解决方案here。
您可能还会发现此page有用,它向我们展示了如何有效地设计rowkeys。
希望这能回答你的问题。
答案 1 :(得分:0)
主要是因为顺序增加的行键将被写入同一区域,并且在写入方面不均匀分布。如果您有一个写密集型应用程序,那么在您的行键中有一些随机性是有意义的。
This is a great explanation (with graphics)关于为什么顺序增加行键对于HBase来说是一个坏主意。