【发布时间】:2013-09-14 04:05:22
【问题描述】:
在 HBase 中,put/get 操作如何知道该行应该写入哪个区域服务器? 如果要读取多行,如何联系多个区域服务器并检索结果?
【问题讨论】:
标签: hadoop nosql hbase hdfs bigdata
在 HBase 中,put/get 操作如何知道该行应该写入哪个区域服务器? 如果要读取多行,如何联系多个区域服务器并检索结果?
【问题讨论】:
标签: hadoop nosql hbase hdfs bigdata
我认为您的问题只是好奇,因为这种行为是从用户那里抽象出来的,您不应该关心。
在 HBase 中,put/get 操作如何知道该行应该写入哪个区域服务器?
HBase 客户端 HTable 负责查找为感兴趣的特定行范围提供服务的 RegionServer。它通过查询.META 来做到这一点。和 -ROOT- 目录表(TODO:解释)。定位到所需区域后,客户端直接联系为该区域提供服务的 RegionServer(即,它不通过主服务器)并发出读取或写入请求。此信息缓存在客户端中,因此后续请求无需经过查找过程。如果一个区域被主负载均衡器重新分配,或者因为一个 RegionServer 已经死亡,客户端将重新查询目录表以确定用户区域的新位置。
所以第一步是在 meta 和 root 中查找以确定它在哪里,然后它联系那个 regionserver 来完成这项工作。
如果要读取多行,如何联系多个区域服务器并检索结果?
一般有两种从 HBase 读取的方法:scanners 和 gets。
如果您运行多个获取,它们将分别单独获取这些记录。这些中的每一个都可能会转到不同的区域服务器。
扫描器将简单地寻找范围的起点,然后从那里向前移动。有时它需要在到达终点时移动到不同的区域服务器,但客户端会在幕后处理。如果有某种方法可以设计表格,使您的多次获取是一次扫描而不是一系列获取,那么假设您应该有更好的性能。
【讨论】:
提供与 BigTable Paper 相同的场景和解释:“客户端库缓存平板电脑位置。如果客户端 不知道平板电脑的位置,或者它是否发现 缓存的位置信息不正确,那么 它递归地向上移动平板电脑位置层次结构。 如果客户端的缓存为空,定位算法 需要三个网络往返,包括一次读取 来自胖乎乎的。如果客户端的缓存是陈旧的,位置 算法最多可能需要六次往返,因为过时 缓存条目仅在未命中时才被发现(假设 METADATA 平板电脑不经常移动)。 虽然数位板位置存储在内存中,所以没有 需要 GFS 访问,我们进一步降低了这个成本 在常见情况下,通过让客户端库预取 平板电脑位置:它读取多个元数据 平板电脑读取 METADATA 表时。”
【讨论】: