请告诉我HBase如何跨区域服务器分区表。
例如,假设我的行键是从0到10M的整数,我有10个区域服务器。
这是否意味着第一个区域服务器将使用值为0 - 10M,第二个1M - 2M,第三个2M-3M,......第十个9M - 10M的键存储所有行吗?
我希望我的行密钥是时间戳,但我认为大多数查询都适用于最新日期,所有查询都只会被一个区域服务器处理,是真的吗?
或者这些数据可能会有不同的传播方式? 或者也许我可以以某种方式创建比我有区域服务器更多的区域,因此(根据给定的示例)服务器1将具有0 - 0,5M和3M - 3,5M的密钥,这样我的数据将更均匀地传播,这是可能?
更新
我刚发现有hbase.hregion.max.filesize
选项,您认为这会解决我的问题吗?
答案 0 :(得分:8)
WRT分区,您可以阅读HBase架构上的Lars'blog post或HBase“克隆”的Google Bigtable论文。
如果您的行键只是一个时间戳,那么具有最大键的区域将始终被新请求命中(因为区域仅由单个区域服务器提供)。
您是否要使用时间戳进行短扫描?如果是这样,请考虑腌制您的密钥(搜索谷歌Mozilla如何使用Sorocco)。
您的前缀可以带有任何ID的时间戳吗?例如,如果您只为特定用户请求数据,那么在ts前面加上该用户ID,它将为您提供更好的负载分配。
如果没有,则使用UUID或其他任意随机分发您的密钥。
关于hbase.hregion.maxfilesize
在该表上设置maxfilesize(可以使用shell执行),并不会使每个区域正好是X MB(其中X是您设置的值)大。因此,假设您的行键都是时间戳,这意味着每个新行键都比前一个更大。这意味着它将始终插入具有空结束键(最后一个)的区域中。在某些时候,其中一个文件将比maxfilesize(通过压缩)大,并且该区域将在中间分开。较低的键将位于其自己的区域中,较高的键位于另一个区域中。但由于您的新行键总是比前一行大,这意味着您只会写入该新区域(依此类推)。
tl; dr即使您拥有超过1,000个区域,使用此架构时,具有最大行键的区域将始终获得写入,这意味着托管区域服务器将成为瓶颈。
答案 1 :(得分:0)
选项hbase.hregion.max.filesize
默认情况下,256 MB设置最大区域大小,在达到此限制区域后会被拆分。这意味着,我的数据将存储在256MB的多个区域中,可能还有一个更小的区域
所以
我希望我的行密钥是时间戳,但我认为大多数查询都适用于最新日期,所有查询都只会被一个区域服务器处理,是真的吗?
事实并非如此,因为最新数据也会在大小为256MB的区域中分割并存储在不同的区域服务器上。