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