hbase源码系列(十五)终结篇Scan续集如何查询出来下一个KeyVal

作者: 云计算机网 分类: 云计算知识 发布时间: 2016-10-29 23:46

这是这个系列的最后一篇了,实在没精力写了,本来还想写一下hbck的,这个东西很常用,当hbase的Meta表出现错误的时候,它能够帮助我们进行修复,无奈看到3000多行的代码时,退却了,原谅我这点自私的想法吧。

在讲《Get、Scan在服务端是如何处理?》当中的nextInternal流程,它的第一步从storeHeap当中取出当前kv,这块其实有点儿小复杂的,因为它存在异构的Scanner(一个MemStoreScanner和多个StoreFileScanner),那怎么保证从storeHeap里面拿出来的总是离上一个kv最接近的kv呢?

这里我们知道,在打开这些Scanner之后,就对他们进行了一下seek操作,它们就已经调整到最佳位置了。

我们看看KeyValueHeap的构造函数里面去看看吧。

public KeyValueHeap(List<? extends KeyValueScanner> scanners, KVComparator comparator) throws IOException {    this.comparator = new KVScannerComparator(comparator);    if (!scanners.isEmpty()) {      this.heap = new PriorityQueue<KeyValueScanner>(scanners.size(),          this.comparator);      //...     this.current = pollRealKV();    }}

它内部有一个叫heap的PriorityQueue<KeyValueScanner>队列,它会对所有的Scanner进行排序,排序的比较器是KVScannerComparator, 然后current又调用了pollRealKV通过比较获得当前的Scanner,后面会讲。

那好,我们直接进去KVScannerComparator看看它的compare方法就能知道怎么回事了。

public int compare(KeyValueScanner left, KeyValueScanner right) {      // 先各取出来一个KeyValue进行比较      int comparison = compare(left.peek(), right.peek());      if (comparison != 0) {        return comparison;      } else {        // key相同,选择最新的那个        long leftSequenceID = left.getSequenceID();        long rightSequenceID = right.getSequenceID();        if (leftSequenceID > rightSequenceID) {          return -1;        } else if (leftSequenceID < rightSequenceID) {          return 1;        } else {          return 0;        }      }}

额,从上面代码看得出来,把left和right各取出一个kv来进行比较,如果一样就比较SequenceID,SequenceID越大说明这个文件越新,返回-1,在升序的情况下,这个Scanner就跑到前面去了。
这样就实现了heap里面拿出来的第一个就是最小的kv的最新版。

在继续将之前,我们看一下在KeyValue是怎么被调用的,这样我们好理清思路。

//从storeHeap里面取出一个来KeyValue current = this.storeHeap.peek();//后面是一顿比较,比较通过,把结果保存到results当中KeyValue nextKv = populateResult(results, this.storeHeap, limit, currentRow, offset, length);

接着看populateResult方法。

private KeyValue populateResult(List<Cell> results, KeyValueHeap heap, int limit,        byte[] currentRow, int offset, short length) throws IOException {      KeyValue nextKv;      do {        //从heap当中取出剩下的结果保存在results当中        heap.next(results, limit - results.size());        //如果够数了,就返回了        if (limit > 0 && results.size() == limit) {          return KV_LIMIT;        }        nextKv = heap.peek();      } while (nextKv != null && nextKv.matchingRow(currentRow, offset, length));      return nextKv;} 
  • 9月19日,河南省网络安全宣传周启动仪式在河南信息广场举行。此次网络安全宣传周活动以网络安全为人民,网络安全靠人民为主题,由省委网信办、省教育厅、省工信委等部门联合举办。



    景安网络作为省级网络安全应急支撑单位,对本次河南省网络安全宣传周做出了积极的响应,景安市场部和信息安全部联合开展了一系列维护网络安全、规范网络秩序,净化网络环境等宣传工作,同时景安网络积极调动网络信息安全小组,充分发挥自身优势,通过投诉举报、情报共享、威胁认定、协同处置、信息发布等多项措施,截至目前本月处理有害信息3500条,拦截非法信息167条,开展专项网络安全课程3次,培养了广大网民的网络安全意识,提升了企业用户识别和防范网上有害信息的能力,推动形成共筑网络安全防线的良好商业环境。

    景安网络信息安全监控中心

    目前,景安网络网站接入数量接近20万个,维护网络安全的任务仍然十分艰巨。网络攻击、网络诈骗、网络侵权等安全事件时有发生,侵犯个人隐私、窃取个人信息、诈骗网民钱财的违法犯罪行为依然存在。

    景安网络总经理陈震鹏表示,景安公司会一如既往的认真贯彻国家网络安全宣传周的精神和理念,不断的提高自身的安全技术水平,更新网络安全设施,为河南网络安全建设,净化网络环境做出应有的努力,同时借助自身在市场上的影响,培养和引导网民学习网络安全知识,提高网络安全意识,为我国从互联网大国向互联网强国迈进贡献自己的力量。

  • 相关推荐:

  • 景安开展系列网络安全活
  • 戴尔XC系列超融合基础架
  • 华为发布“无边界计算”
  • 新华三G3系列服务器带来
  • 中科曙光“变形金刚”系
  • 戴尔易安信PowerVault系列
  • 那些年系列:原来苹果也
  • 研究发现iPhone关注度逐年
  • SystemCenter2012OperationsMan
  • LYNC2013部署系列PART1:L
  • 网站内容禁止违规转载,转载授权联系中国云计算网