在 HBase 中设计行 ID 时,我看到了两条相互矛盾的建议(特别是,但我认为它也适用于 Cassandra。)
- 将您经常聚集在一起的键分组以利用数据局部性。(White, Hadoop: The Definitive Guide,我记得在 HBase 站点上看到过,但找不到...)
- 分散密钥,以便工作可以分布在多台机器上(Twitter幻灯片 14 中的 Twitter、Pig 和 HBase)
我猜哪个是最佳的可能取决于您的用例,但是有没有人对这两种策略有任何经验?
在 HBase 中设计行 ID 时,我看到了两条相互矛盾的建议(特别是,但我认为它也适用于 Cassandra。)
我猜哪个是最佳的可能取决于您的用例,但是有没有人对这两种策略有任何经验?
在 HBase 中,通过划分键空间(按字典顺序对表进行排序)将表划分为区域。表的每个区域都属于单个区域服务器,因此所有读取和写入都由该服务器处理(这允许强一致性保证)。这意味着,如果您的所有读取或写入都集中在您的密钥空间的一小部分,那么您将只能扩展到单个区域服务器可以处理的范围。例如,如果您的数据是时间序列并以时间戳为键,则所有写入都将发送到表中的最后一个区域,并且您将被限制为以单个服务器可以处理的速率进行写入。
另一方面,如果您可以选择您的键,使得任何给定的查询只需要扫描一小部分行,但整个读取和写入集分布在您的键空间中,那么总负载将被分布和扩展很好,但您仍然可以享受查询的局部性优势。