hbase是一个KeyValue型的数据库,在《hbase实战》描述它的逻辑模型【行键,列族,列限定符,时间版本】,物理模型是基于列族的。但实际情况是啥?还是上点代码吧。

     HTableDescriptor tableDesc = new HTableDescriptor("test");
        //日志flush的时候是同步写,还是异步写
        tableDesc.setDurability(Durability.SYNC_WAL);
        //MemStore大小
        tableDesc.setMemStoreFlushSize(256*1024*1024);

        HColumnDescriptor colDesc = new HColumnDescriptor("f");
        //块缓存,保存着每个HFile数据块的startKey
        colDesc.setBlockCacheEnabled(true);
        //块的大小,默认值是65536
        //加载到内存当中的数据块越小,随机查找性能更好,越大,连续读性能更好
        colDesc.setBlocksize(64*1024);
        //bloom过滤器,有ROW和ROWCOL,ROWCOL除了过滤ROW还要过滤列族
        colDesc.setBloomFilterType(BloomType.ROW);
        //写的时候缓存bloom
        colDesc.setCacheBloomsOnWrite(true);
        //写的时候缓存索引
        colDesc.setCacheIndexesOnWrite(true);     //存储的时候使用压缩算法      colDesc.setCompressionType(Algorithm.SNAPPY);
        //进行compaction的时候使用压缩算法
        colDesc.setCompactionCompressionType(Algorithm.SNAPPY);
        //压缩内存和存储的数据,区别于Snappy
        colDesc.setDataBlockEncoding(DataBlockEncoding.PREFIX);
        //写入硬盘的时候是否进行编码
        colDesc.setEncodeOnDisk(true);
        //关闭的时候,是否剔除缓存的块
        colDesc.setEvictBlocksOnClose(true);
        //是否保存那些已经删除掉的kv
        colDesc.setKeepDeletedCells(false);
        //让数据块缓存在LRU缓存里面有更高的优先级
        colDesc.setInMemory(true);
        //最大最小版本
        colDesc.setMaxVersions(3);
        colDesc.setMinVersions(1);
        //集群间复制的时候,如果被设置成REPLICATION_SCOPE_LOCAL就不能被复制了
        colDesc.setScope(HConstants.REPLICATION_SCOPE_GLOBAL);
        //生存时间
        colDesc.setTimeToLive(18000);

        tableDesc.addFamily(colDesc);

  在上面列出来表定义和列族定义的所有参数,含义也标上去了,我们经常需要设置的可能就是下面的这些。

     //bloom过滤器,过滤加速        colDesc.setBloomFilterType(BloomType.ROW);
        //压缩内存和存储中的数据,内存紧张的时候设置
        colDesc.setDataBlockEncoding(DataBlockEncoding.PREFIX);     //让数据块缓存在LRU缓存里面有更高的优先级
        colDesc.setInMemory(true);
        //最大版本,没必要的话,就设置成1个
        colDesc.setMaxVersions(1);
        //集群间复制的时候,如果被设置成REPLICATION_SCOPE_LOCAL就不能被复制了
        colDesc.setScope(HConstants.REPLICATION_SCOPE_GLOBAL);     //存储的时候使用压缩算法,这个基本是必备的,hbase的存储大得惊人      colDesc.setCompressionType(Algorithm.SNAPPY);        //进行compaction的时候使用压缩算法        colDesc.setCompactionCompressionType(Algorithm.SNAPPY);

  

  hbase的表在hdfs上面的是这么存储的,/hbase-root/tableName/regionName/familyName/HFile, 在tableName这一级目录会有一个名.tabledesc的文件,在region这一级目录有一个名为.regioninfo的文件,都是明文的。

  了解完表和列族的定义之后,我们看看KeyValue是怎么存储的吧,引用一下代码,可能大家一看就都懂了。

  @Override
    public void write(Cell cell) throws IOException {
      checkFlushed();
      // Row rowkey,起始位置,长度
      write(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength());
      // Column family 列族,起始位置,长度
      write(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength());
      // Qualifier 列名,起始位置,长度
      write(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength());
      // Version 时间戳
      this.out.write(Bytes.toBytes(cell.getTimestamp()));
      // Type Put或者Delete
      this.out.write(cell.getTypeByte());
      // Value 值,起始位置,长度
      write(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());
    }

  好吧,列存储的话存储的时候每个列都会重复前面的rowkey、列族这些信息,在列很多的情况下,rowkey和列族越长,消耗的内存和列族都会很大,所以它们都要尽量的短。

  可以考虑用colDesc.setDataBlockEncoding(DataBlockEncoding.PREFIX_TREE)来压缩一下内存中的大小,这个后面后面会讲到。

hbase源码系列(四)数据模型-表定义和列族定义的具体含义的更多相关文章

  1. hbase源码系列(十二)Get、Scan在服务端是如何处理

    hbase源码系列(十二)Get.Scan在服务端是如何处理?   继上一篇讲了Put和Delete之后,这一篇我们讲Get和Scan, 因为我发现这两个操作几乎是一样的过程,就像之前的Put和Del ...

  2. 11 hbase源码系列(十一)Put、Delete在服务端是如何处理

    hbase源码系列(十一)Put.Delete在服务端是如何处理?    在讲完之后HFile和HLog之后,今天我想分享是Put在Region Server经历些了什么?相信前面看了<HTab ...

  3. 10 hbase源码系列(十)HLog与日志恢复

    hbase源码系列(十)HLog与日志恢复   HLog概述 hbase在写入数据之前会先写入MemStore,成功了再写入HLog,当MemStore的数据丢失的时候,还可以用HLog的数据来进行恢 ...

  4. HBase源码系列之HFile

    本文讨论0.98版本的hbase里v2版本.其实对于HFile能有一个大体的较深入理解是在我去查看"到底是不是一条记录不能垮block"的时候突然意识到的. 首先说一个对HFile ...

  5. 9 hbase源码系列(九)StoreFile存储格式

    hbase源码系列(九)StoreFile存储格式    从这一章开始要讲Region Server这块的了,但是在讲Region Server这块之前得讲一下StoreFile,否则后面的不好讲下去 ...

  6. hbase源码系列(十二)Get、Scan在服务端是如何处理?

    继上一篇讲了Put和Delete之后,这一篇我们讲Get和Scan, 因为我发现这两个操作几乎是一样的过程,就像之前的Put和Delete一样,上一篇我本来只打算写Put的,结果发现Delete也可以 ...

  7. Spring源码系列(四)--spring-aop是如何设计的

    简介 spring-aop 用于生成动态代理类(底层是使用 JDK 动态代理或 cglib 来生成代理类),搭配 spring-bean 一起使用,可以使 AOP 更加解耦.方便.在实际项目中,spr ...

  8. hbase源码系列(十四)Compact和Split

    先上一张图讲一下Compaction和Split的关系,这样会比较直观一些. Compaction把多个MemStore flush出来的StoreFile合并成一个文件,而Split则是把过大的文件 ...

  9. hbase源码系列(八)从Snapshot恢复表

    在看这一章之前,建议大家先去看一下snapshot的使用.这一章是上一章snapshot的续集,上一章了讲了怎么做snapshot的原理,这一章就怎么从snapshot恢复表. restoreSnap ...

随机推荐

  1. Android事件处理的2种方式:监听器与回调

    android组件的事件处理有2种方式: 1.基于监听器的事件处理方式:先定义组件,然后为组件设定监听器. 详见http://blog.csdn.net/jediael_lu/article/deta ...

  2. iOS_生成pem推送证书(用于百度云推送)

    具体步骤如下: 首先,需要一个pem的证书,该证书需要与开发时签名用的一致. 具体生成pem证书方法如下: 1. 登录到 iPhone Developer Connection Portal(http ...

  3. java.lang.SecurityException:Servlet of class org.apache.catalina.servlets.InvokerServlet is privileged

    转自:http://www.cnblogs.com/orientsun/archive/2012/11/04/2753270.html Error: java.lang.SecurityExcepti ...

  4. 深入理解Linux内核-内核同步

    内核基本的同步机制: 抢占内核的主要特点:一个在内核态运行的进程,可能在执行内核函数期间被另外一个进程取代. 内核抢占:Linux 2.6允许用户在编译内核的时候配置十分启用 进程临界区:每个进程中访 ...

  5. 转:显示技术中的帧、帧数、帧率、 FPS

    在视频领域,电影.电视.数字视频等可视为随时间连续变换的许多张画面,而“帧( Frame)”是指每一张画面.而我们日常口语习惯或者说不严谨的交流中,通常对于帧数( Frames)与帧率( Frame ...

  6. [Windows Azure] Development Considerations in Windows Azure SQL Database

    Development Considerations in Windows Azure SQL Database 3 out of 5 rated this helpful - Rate this t ...

  7. SVN文件加锁

    原文:SVN与TortoiseSVN实战:文件加锁详解 加锁与解锁的操作对于项目中的二进制文件,如图片.声音.动态库等不可合并文件是非常有用的,可以让这些文件防止产生恼人的冲突,但TortoiseSV ...

  8. Kafka 协议实现中的内存优化【转】

    Kafka 协议实现中的内存优化   Jusfr 原创,转载请注明来自博客园 Request 与 Response 的响应格式 Request 与 Response 都是以 长度+内容 形式描述, 见 ...

  9. 【教程】InstallShield使用完全教程

    InstallShield Installshield是一个强大和易于使用,用于解决Windows软件安装包开发的制作工具.用它可以以传统MSI方式和虚拟格式,自动化地封装.捆绑和包装你的产品. In ...

  10. APT典型应用示例

    Ubuntu下的APT(Advanced Packaging Tools,高级软件包管理工具)是用于在Ubuntu下用于软件安装.升级.维护的工具.注意运行apt指令需要root权限. 下面是一个简单 ...