加入收藏 | 设为首页 | 会员中心 | 我要投稿 南通站长网 (https://www.0513zz.cn/)- 专有云、图像技术、经验、数据治理、专属主机!
当前位置: 首页 > 站长资讯 > 评论 > 正文

AI给你介绍了个对象

发布时间:2021-01-28 16:29:01 所属栏目:评论 来源:互联网
导读:Client 先访问 ZooKeeper,获取 hbase:meta 表位于哪个 Region Server。 访问对应的 Region Server,获取 hbase:meta 表,根据读请求的 namespace:table/rowkey, 查询出目标数据位于哪个 Region Server 中的哪个 Region 中。并将该 table 的 region 信息以
  1. Client 先访问 ZooKeeper,获取 hbase:meta 表位于哪个 Region Server。
  2. 访问对应的 Region Server,获取 hbase:meta 表,根据读请求的 namespace:table/rowkey, 查询出目标数据位于哪个 Region Server 中的哪个 Region 中。并将该 table 的 region 信息以 及 meta 表的位置信息缓存在客户端的 meta cache,方便下次访问。
  3. 与目标 Region Server 进行通讯。
  4. 分别在 Block Cache(读缓存),MemStore 和 Store File(HFile)中查询目标数据,并将 查到的所有数据进行合并。此处所有数据是指同一条数据的不同版本(time stamp)或者不同的类型(Put/Delete)。
  5. 将从文件HFile中查询到的数据块(Block,HFile 数据存储单元,默认大小为 64KB)缓存到 Block Cache。
  6. 将合并后的最终结果,然后返回时间最新的数据返回给客户端。

4.2.1 Block Cache

HBase 在实现中提供了两种缓存结构 MemStore(写缓存) 和 BlockCache(读缓存)。写缓存前面说过不再重复。

HBase 会将一次文件查找的 Block块 缓存到 Cache中,以便后续同一请求或者邻近数据查找请求,可以直接从内存中获取,避免昂贵的IO操作。

BlockCache是Region Server级别的,

一个Region Server只有一个Block Cache,在 Region Server 启动的时候完成 Block Cache 的初始化工作。

HBase对Block Cache的管理分为如下三种。

LRUBlockCache 是最初的实现方案,也是默认的实现方案,将所有数据都放入JVM Heap中,交给JVM进行管理。

SlabCache 实现的是堆外内存存储,不再由JVM管理数据内存。一般跟第一个组合使用,单它没有改善 GC 弊端,引入了堆外内存利用率低。

BucketCache 缓存淘汰不再由 JVM 管理 降低了Full GC 发生的频率。

重点:

读数据时不要理解为先从 MemStore 中读取,读不到再读 BlockCache 中,还读不到再从HFile中读取,然后将数据写入到 BlockCache 中。因为如果人为设置导致磁盘数据new,内存数据old。你读取的时候会出错的!

结论:

HBase 把磁盘跟内存数据一起读,然后把磁盘数据放到 BlockCache中,BlockCache 是磁盘数据的缓存。HBase 是个读比写慢的工具。

4.3 HBase 为什么写比读快

HBase 能提供实时计算服务主要原因是由其架构和底层的数据结构决定的,即由LSM-Tree(Log-Structured Merge-Tree) + HTable(Region分区) + Cache决定的。

HBase 写入速度快是因为数据并不是真的立即落盘,而是先写入内存,随后异步刷入HFile。所以在客户端看来,写入速度很快。

HBase 存储到内存中的数据是有序的,内存数据刷写到HFile时也是有序的。并且多个有序的HFile还会进行归并排序生成更大的有序HFile。性能测试发现顺序读写磁盘速度比随机读写磁盘快至少三个数量级!
 

三、总结

相关的处理就这么多。这里实现的关键点是:

  • 外部令牌和枚举器令牌都对allDone有贡献
  • 传输中发送和接收代码使用allDone.Token
  • 生产者枚举使用allDone.Token
  • 任何情况下退出枚举器,allDone都会被终止
  • 如果传输接收错误,则allDone被终止
  • 如果消费者提前终止,则allDone被终止
  • 当我们收到来自服务器的最后一条消息后,allDone被终止
  • 如果生产者或传输发送错误,allDone被终止

最后多说一点,关于ConfigureAwait(false):

默认情况下,await包含一个对SynchronizationContext.Current的检查。除了表示额外的上下文切换之外,在UI应用程序的情况下,它也意味着在UI线程上运行不需要在UI线程上运行的代码。库代码通常不需要这样做。因此,在库代码中,通常应该在所有用到await的地方使用. configureawait (false)来绕过这个检查。而在一般应用程序的代码中,应该默认只使用await而不使用ConfigureAwait,除非你知道你在做什么。

(编辑:南通站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读