`
punishzhou
  • 浏览: 141247 次
社区版块
存档分类
最新评论

HBase的数据的update

 
阅读更多

hbase是以rowkey,column,timestamp这三个维度来区分的。

即如果两条记录其rowkey,column,timestamp一样的话,那么hbase就会认为其是相同的数据。

 

         row     column   value   time
put      r1     cf:c1      '5'       10
put      r1     cf:c1      '6'       10
put      r1     cf:c2      '7'  
put      r1     af:c2      '8'
put      r2     cf:c1      '9'

 

 如上所示首先插入一条数据其值为5,然后又插入一条数据其值为6.

此时用客户端接口取到的都是value=‘6’的数据,这可以认为是对原数据的一个覆盖。

我们知道hbase的write数据是以append的形式追加的。只有当前compact的时候才会进行无效数据删除。

那么在compact之前hbase的存储文件就存在该记录的两份不同的数据,那么hbase是怎么区别这两份数据,并返回给用户的呢,下面从代码角度来分析

首先我们来看hbase的put过程,这个逻辑比较清除,首先根据table,和row找到相对应的region,然后和该region的regionserver通信。

其写入过程是一个wal过程,即先写日志后写内存,保证数据不会因为regionserver down而丢失。

 

写日志的过程不赘述了。

 

主要来看看写memstore的过程:

 

  private long applyFamilyMapToMemstore(Map<byte[], List<KeyValue>> familyMap) {
    ReadWriteConsistencyControl.WriteEntry w = null;
    long size = 0;
    try {
      w = rwcc.beginMemstoreInsert();

      for (Map.Entry<byte[], List<KeyValue>> e : familyMap.entrySet()) {
        byte[] family = e.getKey();
        List<KeyValue> edits = e.getValue();

        Store store = getStore(family);
        for (KeyValue kv: edits) {
          kv.setMemstoreTS(w.getWriteNumber());
          size += store.add(kv);
        }
      }
    } finally {
      rwcc.completeMemstoreInsert(w);
    }
    return size;
  }

 

rwcc是用来控制读写一致性的,对于任何一个put,当其写入memstore的时候,都会设置其MemstoreTs的值。

而这个值在内存中是以一个递增的形式存在的,即新写入内存的数据比旧的其MemstoreTs大。而这个值就是用来保证在内存中的update的可靠性。举个例子,还是上面的两个put

1. put      r1     cf:c1      '5'       10
2. put      r1     cf:c1      '6'       10

第一条记录首先写进内存其memstoreTs为1,第二条记录的memstoreTs为二,那么第二条记录在内存中就排在第一条记录前面,说到这来看看内存中数据是怎么排序的。

 

我们知道hbase 是以key-value存放数据的,其底层存储完全依赖HDFS文件系统。

同样在内存中存储的也是key-value,在磁盘上是以storefile(hfile)存储,且都是有序的

其排序规则如下:

(以自然序列排序 a<b,2<3,23<3)

首先比较 rowkey 小的排前面

然后是  family小的排前面

接下来按排 column

然后是timestamp 排序 时间越大的拍前面

接下来是按key的TYPE排序 有min,delete,deleteFamily,put,deletecolumn,max

最后比较文件的maxsequenceId,越大的说明越新排在前面。memstore的maxsequenceId默认是整数最大值

如果是两个相同key的put的数据都在内存里那么上面的比较规则就都不适用了,此时就会比较这两个put的memstoreTs, 大的排在前面。

我们知道一个put里面可以有很多cf,那么如果在一个put当中有两个一样的数据,此时会如何呢。

这个hbase也做了处理。一个put中维护的是一个familymap<family,map<>>格式,显然当有两条一致的数据插入时,map自动会覆盖前一条数据。

 

 

那么此时用户以指定key取该条数据的话,会遵循以下原则:

 

首先从定位memstore和每个storefile(一个family就是一个Hstore,包裹一个Memstore和n个storefile)的target value的row的起始处。,比较当前memstoe和storefile的keyvalue,选取最靠前的数据,若满足则返回,若不满足则取下一条知道找到为止。

 显然在这个过程中上述的put的第二条数据肯定是在第一条数据前面的,所以首先会取到第二条即最新的数据~~~

 

hbase就是通过keyvalue的排序和get的机制来保证取到的都是最新的value

 

 

 

 

 

 

 

 

 

分享到:
评论
1 楼 di1984HIT 2014-10-10  
学习了~~~

相关推荐

    hbase orm simplehbase v1.0

    insert,update支持: 建立在hbase的checkAndPut之上。 hbase多版本支持:提供接口可以对hbase多版本数据进行查询,映射。 hbase批量操作支持。 hbase原生接口支持。 HTablePool管理。 HTable count和sum功能。

    HBase轻量级中间件simplehbase.zip

    simplehbase是java和hbase之间的轻量级中间件。... insert,update支持: 建立在hbase的checkAndPut之上。    hbase多版本支持:提供接口可以对hbase多版本数据进行查询,映射。 标签:simplehbase

    hive 整合 hbase

    所以,Hbase对表的操作也不支持update,同时也不支持delete, 只有一个insert的操作,所有的操作都是insert操作。当删除时,就是向表里面插入一行数据,并加上删除标记。update时,就向表里插入一条数据,根据时间戳...

    kudu原理与使用

    官方给kudu的定位是:在更新更及时的基础上实现更快的数据分析1.2.1、hdfs与hbase数据存储的缺点目前数据存储有了HDFS与hbase,为什么还要额外的弄一个kudu呢?HDFS:使用列式存储格式ApacheParquet,Apache ORC,适合...

    DevOps-Python-tools:80多种DevOps和数据CLI工具-AWS,GCP,GCF Python云函数,日志匿名器,Spark,Hadoop,HBase,Hive,Impala,Linux,Docker,Spark数据转换器和验证器(AvroParquetJSONCSVINIXMLYAML),Travis CI,AWS CloudFormation,Elasticsearch,Solr等

    AWS,Docker,Spark,Hadoop,HBase,Hive,Impala,Python和Linux工具 DevOps,云,大数据,NoSQL,Python和Linux工具。 所有程序都具有--help 。 也可以看看: repos包含数百种针对云,大数据,SQL,NoSQL,Web和...

    2017最新大数据架构师精英课程

    134_hive同hbase集成,统计hbase数据表信息% Q/ R! Z1 J3 J) k+ H! {6 D# M 135_使用TableInputFormat进行MR编程! m& C6 B/ v6 N" `, I' O& }4 u 136_使用phoenix交互hbase& h* s5 S- ~6 ]: u7 \ 137_squirrel工具. ...

    Hadoop权威指南(第2版).

    Redhat Linux AS4 ( Nahant update 5 ) · Sun Java JDK1.6.0_05 - b13 · 所以整个集群有30000多个CPU,近16PB的磁盘空间! HDFS把节点分成两类:NameNode和DataNode。NameNode是唯一的,程序与之通信,然后从...

    数据库审计系统基本原理与部署方式.pdf

    第四阶段:⼤数据审计阶段 解决⾯向对象的M语⾔安全设计问题,全⾯⽀持⼤数据审计,Hive、HBASE、MogoDB等 数据审计系统可审计的风险项: 功能项 功能项 策 略 元 素 策 略 元 素 登录风险 对IP、MAC、客户端、⽤户...

    Apress - Pro Hadoop

     • Redhat Linux AS4 ( Nahant update 5 )  • Sun Java JDK1.6.0_05 - b13  • 所以整个集群有30000多个CPU,近16PB的磁盘空间!  HDFS把节点分成两类:NameNode和DataNode。NameNode是唯一的,程序与之...

    分布式协调工具-ZooKeeper实现动态负载均衡

    使用方法通常是不同系统都对ZK上同一个znode进行注册,监听znode的变化(包括znode本身内容及子节点的),其中一个系统update了znode,那么另一个系统能够收到通知,并作出相应处理 1. 另一种心跳检测机制:检测...

    MapReduceSkeleton:Hadoop MapReduce 骨架

    MapReduceSkeleton介绍这是一个 MapReduce Skeleton 作业,支持 MariaDB/MySQL(和即将推出的 HBase)作为输入数据集和输出。 SQL配置在Main.java中,如果使用UPDATE方式,需要修改MysqlDBOutputFormat.java中的...

Global site tag (gtag.js) - Google Analytics