2013-05-03 73 views
2

我正在编写一个将RDBMS转换为HBase的程序。我选择了一个顺序实体作为像Employee ID(1,2,3 ....)这样的行键,但是我在某个地方读取了它,该行键不应该是一个顺序实体。我的问题是为什么不推荐选择顺序行密钥。与此相关的设计前景是什么?如何在Hbase中设计行密钥

回答

9

尽管顺序行键允许更快的扫描,但在某个点之后会成为问题,因为在读取/写入期间会导致不期望的RegionServer hotspotting。通过其默认行为,Hbase将具有类似键的行存储到同一个区域。它允许更快的范围扫描。因此,如果rowkeys是连续的,则所有数据都将开始传送到同一台计算机,从而导致该计算机上的负载不均匀。这被称为RegionServer热点,并且是不使用顺序键背后的主要动机。我会用“写”来解释这里的问题。

当将具有连续键的记录写入HBase时,所有写入命中一个Region。如果某个区域由多个区域服务器提供服务,则这不会成为问题,但情况并非如此 - 每个区域只位于一个区域服务器上。每个区域都有一个预先定义的最大尺寸,所以在一个区域达到该尺寸后,它会分成两个较小的区域。之后,这些新区域中的一个会获取所有新记录,然后该区域和服务它的区域服务器成为新的热点受害者。很明显,这种不均匀的写入负载分布是非常不受欢迎的,因为它将写入吞吐量限制为单个服务器的容量,而不是使用HBase集群中的多个/所有节点。

你可以找到一个非常好的问题解释以及其解决方案here

您也许会发现这page有帮助,它向我们展示了如何有效地设计rowkeys。

希望这回答你的问题。

+1

非常明确的解释。谢谢Tariq :) – abbasdjinn 2013-05-06 07:39:07

0

主要是因为按顺序增加的行键将被写入相同的区域,并且在写入方面不均匀分布。如果你有一个写密集型应用程序,那么在你的行键中有一些随机性是有意义的。

This is a great explanation (with graphics)关于为什么顺序增加的行键对HBase来说是个坏主意。

+0

在什么情况下数据被写入不同的集群?“同一集群”是指“同一个服务器”? – Tariq 2013-05-03 19:52:40

+0

对不起。现在更新答案。 – Suman 2013-05-03 20:19:59

+0

非常欢迎;) – Tariq 2013-05-03 20:37:35