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

  1.      HTableDescriptor tableDesc = new HTableDescriptor("test");
  2. //日志flush的时候是同步写,还是异步写
  3. tableDesc.setDurability(Durability.SYNC_WAL);
  4. //MemStore大小
  5. tableDesc.setMemStoreFlushSize(256*1024*1024);
  6.  
  7. HColumnDescriptor colDesc = new HColumnDescriptor("f");
  8. //块缓存,保存着每个HFile数据块的startKey
  9. colDesc.setBlockCacheEnabled(true);
  10. //块的大小,默认值是65536
  11. //加载到内存当中的数据块越小,随机查找性能更好,越大,连续读性能更好
  12. colDesc.setBlocksize(64*1024);
  13. //bloom过滤器,有ROW和ROWCOL,ROWCOL除了过滤ROW还要过滤列族
  14. colDesc.setBloomFilterType(BloomType.ROW);
  15. //写的时候缓存bloom
  16. colDesc.setCacheBloomsOnWrite(true);
  17. //写的时候缓存索引
  18. colDesc.setCacheIndexesOnWrite(true);     //存储的时候使用压缩算法      colDesc.setCompressionType(Algorithm.SNAPPY);
  19. //进行compaction的时候使用压缩算法
  20. colDesc.setCompactionCompressionType(Algorithm.SNAPPY);
  21. //压缩内存和存储的数据,区别于Snappy
  22. colDesc.setDataBlockEncoding(DataBlockEncoding.PREFIX);
  23. //写入硬盘的时候是否进行编码
  24. colDesc.setEncodeOnDisk(true);
  25. //关闭的时候,是否剔除缓存的块
  26. colDesc.setEvictBlocksOnClose(true);
  27. //是否保存那些已经删除掉的kv
  28. colDesc.setKeepDeletedCells(false);
  29. //让数据块缓存在LRU缓存里面有更高的优先级
  30. colDesc.setInMemory(true);
  31. //最大最小版本
  32. colDesc.setMaxVersions(3);
  33. colDesc.setMinVersions(1);
  34. //集群间复制的时候,如果被设置成REPLICATION_SCOPE_LOCAL就不能被复制了
  35. colDesc.setScope(HConstants.REPLICATION_SCOPE_GLOBAL);
  36. //生存时间
  37. colDesc.setTimeToLive(18000);
  38.  
  39. tableDesc.addFamily(colDesc);

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

  1.      //bloom过滤器,过滤加速 colDesc.setBloomFilterType(BloomType.ROW);
  2. //压缩内存和存储中的数据,内存紧张的时候设置
  3. colDesc.setDataBlockEncoding(DataBlockEncoding.PREFIX);     //让数据块缓存在LRU缓存里面有更高的优先级
  4. colDesc.setInMemory(true);
  5. //最大版本,没必要的话,就设置成1个
  6. colDesc.setMaxVersions(1);
  7. //集群间复制的时候,如果被设置成REPLICATION_SCOPE_LOCAL就不能被复制了
  8. 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是怎么存储的吧,引用一下代码,可能大家一看就都懂了。

  1.   @Override
  2. public void write(Cell cell) throws IOException {
  3. checkFlushed();
  4. // Row rowkey,起始位置,长度
  5. write(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength());
  6. // Column family 列族,起始位置,长度
  7. write(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength());
  8. // Qualifier 列名,起始位置,长度
  9. write(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength());
  10. // Version 时间戳
  11. this.out.write(Bytes.toBytes(cell.getTimestamp()));
  12. // Type Put或者Delete
  13. this.out.write(cell.getTypeByte());
  14. // Value 值,起始位置,长度
  15. write(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());
  16. }

  好吧,列存储的话存储的时候每个列都会重复前面的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. jmeter maven自动移动jar包windows 批处理命令

    jmeter项目maven文件下面放这.bat 工具,可以把必要的jar包移动到jmeter响应的文件夹下面 rem 本文件放在jmeter 脚本maven项目根目录下面,和pom.xml在同一个文件 ...

  2. Navicat_Premium 连接oracle遇到ORA-28457

    解决方案很简单,我用oracle文件目录下的oci.dll替换了navicat文件目录下的oci.dll,之后很顺畅地就连上了.

  3. 本地启动spark-shell

    由于spark-1.3作为一个里程碑式的发布, 加入众多的功能特性,所以,有必要好好的研究一把,spark-1.3需要scala-2.10.x的版本支持,而系统上默认的scala的版本为2.9,需要进 ...

  4. elk 的报错和优化

    参数调整 elasticsearch.yml配置文件里面,调整http.max_content_length: 500mb 这个默认就100m 建议调大 之前有过报错 #如果队列满了logstash就 ...

  5. Spring 注解@Component,@Service,@Controller,@Repository

    Spring 注解@Component,@Service,@Controller,@RepositorySpring 2.5 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释, ...

  6. git android.google 源码:Unknown SSL protocol error in connection to code.google.com:443

    想要提取android的源码.就必须要使用git.下面是本人安装的过程发生的问题: 1.1安装git.win的命令行的客户端(相当与svn的乌龟那样使用).http://git-scm.com/dow ...

  7. js递归函数使用介绍

    所谓的递归函数就是在函数体内调用本函数.使用递归函数一定要注意,处理不当就会进入死循环.递归函数只有在特定的情况下使用 ,比如阶乘问题 一个10以内的阶乘,js递归函数实例代码: <!DOCTY ...

  8. [转载]java日志框架log4j详细配置及与slf4j联合使用教程

    一.log4j基本用法 首先,配置log4j的jar,maven工程配置以下依赖,非maven工程从maven仓库下载jar添加到“build path” 1 2 3 4 5 <dependen ...

  9. Flink papers

    Around 2009 the Stratosphere research project started at the TU Berlin which a few years later was s ...

  10. angular中的表单数据自定义验证

    之前说过了angular是如何给表单的数据进行基本的,常用的验证的:angular学习笔记(二十)-表单验证 但是在实际工作中,这些验证是远远不够的,很多时候我们需要自定义一些验证规则,以及一些异步, ...