分享

hbase源码系列(四)数据模型-表定义和列族定义的具体含义

本帖最后由 坎蒂丝_Swan 于 2014-12-29 12:58 编辑

问题导读
1.hbase的表在hdfs上是怎么存储的?
2.KeyValue是怎么存储的?









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);
  19.      //存储的时候使用压缩算法
  20.       colDesc.setCompressionType(Algorithm.SNAPPY);
  21.         //进行compaction的时候使用压缩算法
  22.         colDesc.setCompactionCompressionType(Algorithm.SNAPPY);
  23.         //压缩内存和存储的数据,区别于Snappy
  24.         colDesc.setDataBlockEncoding(DataBlockEncoding.PREFIX);
  25.         //写入硬盘的时候是否进行编码
  26.         colDesc.setEncodeOnDisk(true);
  27.         //关闭的时候,是否剔除缓存的块
  28.         colDesc.setEvictBlocksOnClose(true);
  29.         //是否保存那些已经删除掉的kv
  30.         colDesc.setKeepDeletedCells(false);
  31.         //让数据块缓存在LRU缓存里面有更高的优先级
  32.         colDesc.setInMemory(true);
  33.         //最大最小版本
  34.         colDesc.setMaxVersions(3);
  35.         colDesc.setMinVersions(1);
  36.         //集群间复制的时候,如果被设置成REPLICATION_SCOPE_LOCAL就不能被复制了
  37.         colDesc.setScope(HConstants.REPLICATION_SCOPE_GLOBAL);
  38.         //生存时间
  39.         colDesc.setTimeToLive(18000);
  40.         
  41.         tableDesc.addFamily(colDesc);
复制代码

在上面列出来表定义和列族定义的所有参数,含义也标上去了,我们经常需要设置的可能就是下面的这些。
  1. //bloom过滤器,过滤加速
  2.         colDesc.setBloomFilterType(BloomType.ROW);
  3.         //压缩内存和存储中的数据,内存紧张的时候设置
  4.         colDesc.setDataBlockEncoding(DataBlockEncoding.PREFIX);
  5.      //让数据块缓存在LRU缓存里面有更高的优先级
  6.         colDesc.setInMemory(true);
  7.         //最大版本,没必要的话,就设置成1个
  8.         colDesc.setMaxVersions(1);
  9.         //集群间复制的时候,如果被设置成REPLICATION_SCOPE_LOCAL就不能被复制了
  10.         colDesc.setScope(HConstants.REPLICATION_SCOPE_GLOBAL);
  11.      //存储的时候使用压缩算法,这个基本是必备的,hbase的存储大得惊人
  12.       colDesc.setCompressionType(Algorithm.SNAPPY);
  13.         //进行compaction的时候使用压缩算法
  14.         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源码系列(二)HTable 探秘hbase源码系列(三)Client如何找到正确的Region Server
hbase源码系列(四)数据模型-表定义和列族定义的具体含义
hbase源码系列(五)Trie单词查找树
hbase源码系列(六)HMaster启动过程
hbase源码系列(七)Snapshot的过程
hbase源码系列(八)从Snapshot恢复表
hbase源码系列(九)StoreFile存储格式
hbase源码系列(十)HLog与日志恢复
hbase源码系列(十一)Put、Delete在服务端是如何处理?
hbase源码系列(十二)Get、Scan在服务端是如何处理?
hbase源码系列(十三)缓存机制MemStore与Block Cache
hbase源码之如何查询出来下一个KeyValue
hbase源码Compact和Split






欢迎加入about云群90371779322273151432264021 ,云计算爱好者群,亦可关注about云腾讯认证空间||关注本站微信

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条