9

在 HBase 中,put/get 操作如何知道该行应该写入哪个区域服务器?如果要读取多行,如何联系多个区域服务器并检索结果?

4

2 回答 2

9

我认为您的问题只是好奇,因为这种行为是从用户那里抽象出来的,您不应该关心。


在 HBase 中,put/get 操作如何知道该行应该写入哪个区域服务器?

hbase 文档书中

HBase 客户端 HTable 负责查找为感兴趣的特定行范围提供服务的 RegionServer。它通过查询.META 来做到这一点。和 -ROOT- 目录表(TODO:解释)。定位到所需区域后,客户端直接联系服务于该区域的 RegionServer(即不经过主服务器)并发出读取或写入请求。此信息缓存在客户端中,因此后续请求无需经过查找过程。如果一个区域被主负载均衡器重新分配或者因为一个 RegionServer 已经死亡,客户端将重新查询目录表以确定用户区域的新位置。

所以第一步是在 meta 和 root 中查找以确定它在哪里,然后它联系那个 regionserver 来完成这项工作。


如果要读取多行,如何联系多个区域服务器并检索结果?

通常有两种从 HBase 读取的方法:scannersgets

如果您运行多个获取,它们将分别单独获取这些记录。这些中的每一个都可能会转到不同的区域服务器。

扫描仪将简单地寻找范围的起点,然后从那里向前移动。有时当它到达终点时需要移动到不同的区域服务器,但客户端在幕后处理。如果有某种方法可以设计表格,使您的多次获取是一次扫描而不是一系列获取,那么假设您应该具有更好的性能。

于 2013-09-10T14:07:27.183 回答
1

提供来自 BigTable Paper 的相同场景和解释:“客户端库缓存平板电脑位置。如果客户端不知道平板电脑的位置,或者如果发现缓存的位置信息不正确,则它递归地向上移动平板电脑位置层次结构. 如果客户端的缓存是空的,定位算法需要3次网络往返,包括一次从Chubby读取。如果客户端的缓存是陈旧的,定位算法最多可能需要6次往返,因为陈旧的缓存条目只会被发现在未命中时(假设 METADATA tablet 不经常移动)。虽然 tablet 位置存储在内存中,因此不需要 GFS 访问,我们通过让客户端库预取 tablet 位置在常见情况下进一步降低此成本:每当它读取 METADATA 表时,它就会读取多个平板电脑的元数据。”

http://static.googleusercontent.com/external_content/untrusted_dlcp/research.google.com/en/us/archive/bigtable-osdi06.pdf

于 2013-10-11T21:41:21.407 回答