7

请告诉我 HBase 如何跨区域服务器分区表。

例如,假设我的行键是从 0 到 10M 的整数,并且我有 10 个区域服务器。
这是否意味着第一个 regionserver 将存储键值为 0 - 10M,第二个 1M - 2M,第三个 2M-3M,...第十个 9M - 10M 的所有行?

我希望我的行键是时间戳,但我认为大多数查询将适用于最新日期,所有查询将仅由一个区域服务器处理,是真的吗?

或者也许这些数据会以不同的方式传播?
或者,也许我可以以某种方式创建比我拥有的区域服务器更多的区域,因此(根据给定的示例)服务器 1 将具有密钥 0 - 0,5M 和 3M - 3,5M,这样我的数据将更平均地分布,是这样吗可能的?


更新

我刚刚发现有选项hbase.hregion.max.filesize,你认为这会解决我的问题吗?

4

2 回答 2

8

WRT 分区,您可以阅读 Lars 关于 HBase 架构的文或 Google 的 HBase“克隆”的 Bigtable 论文。

如果您的行键只是一个时间戳,那么是的,具有最大键的区域将始终受到新请求的影响(因为一个区域仅由单个区域服务器提供服务)。

您想使用时间戳来进行短扫描吗?如果是这样,请考虑为您的密钥加盐(搜索 google 以了解 Mozilla 如何使用 Sorocco 进行此操作)。

您可以在时间戳前面加上任何 ID 吗?例如,如果您只请求特定用户的数据,则在 ts 前面加上该用户 ID,这将为您提供更好的负载分配。

如果没有,请使用 UUID 或其他任何会随机分配您的密钥的东西。

关于hbase.hregion.maxfilesize

在该表上设置 maxfilesize(您可以使用 shell 进行操作),并不会使每个区域都恰好是 X MB(其中 X 是您设置的值)大。因此,假设您的行键都是时间戳,这意味着每个新的行键都比前一个大。这意味着它将始终插入到带有空结束键(最后一个)的区域中。在某些时候,其中一个文件将增长到大于 maxfilesize(通过压缩),并且该区域将在中间分割。较低的键将在他们自己的区域中,较高的键在另一个区域中。但是由于您的新行键总是比前一个大,这意味着您只会写入该新区域(依此类推)。

tl;dr 即使您有超过 1,000 个区域,使用此模式,具有最大行键的区域将始终获得写入,这意味着托管区域服务器将成为瓶颈。

于 2010-08-05T16:24:25.700 回答
0

默认情况下为 256MB 的选项hbase.hregion.max.filesize设置最大区域大小,达到此限制区域后将被拆分。这意味着,我的数据将存储在 256MB 的多个区域中,可能还有一个更小的区域。
所以

我希望我的行键是时间戳,但我认为大多数查询将适用于最新日期,所有查询将仅由一个区域服务器处理,是真的吗?

这不是真的,因为最新的数据也会被分割成 256MB 大小的区域并存储在不同的区域服务器上。

于 2010-08-05T20:04:11.607 回答