hbase源码系列(四)数据模型-表定义和列族定义的具体含义
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源码系列(四)数据模型-表定义和列族定义的具体含义的更多相关文章
- hbase源码系列(十二)Get、Scan在服务端是如何处理
hbase源码系列(十二)Get.Scan在服务端是如何处理? 继上一篇讲了Put和Delete之后,这一篇我们讲Get和Scan, 因为我发现这两个操作几乎是一样的过程,就像之前的Put和Del ...
- 11 hbase源码系列(十一)Put、Delete在服务端是如何处理
hbase源码系列(十一)Put.Delete在服务端是如何处理? 在讲完之后HFile和HLog之后,今天我想分享是Put在Region Server经历些了什么?相信前面看了<HTab ...
- 10 hbase源码系列(十)HLog与日志恢复
hbase源码系列(十)HLog与日志恢复 HLog概述 hbase在写入数据之前会先写入MemStore,成功了再写入HLog,当MemStore的数据丢失的时候,还可以用HLog的数据来进行恢 ...
- HBase源码系列之HFile
本文讨论0.98版本的hbase里v2版本.其实对于HFile能有一个大体的较深入理解是在我去查看"到底是不是一条记录不能垮block"的时候突然意识到的. 首先说一个对HFile ...
- 9 hbase源码系列(九)StoreFile存储格式
hbase源码系列(九)StoreFile存储格式 从这一章开始要讲Region Server这块的了,但是在讲Region Server这块之前得讲一下StoreFile,否则后面的不好讲下去 ...
- hbase源码系列(十二)Get、Scan在服务端是如何处理?
继上一篇讲了Put和Delete之后,这一篇我们讲Get和Scan, 因为我发现这两个操作几乎是一样的过程,就像之前的Put和Delete一样,上一篇我本来只打算写Put的,结果发现Delete也可以 ...
- Spring源码系列(四)--spring-aop是如何设计的
简介 spring-aop 用于生成动态代理类(底层是使用 JDK 动态代理或 cglib 来生成代理类),搭配 spring-bean 一起使用,可以使 AOP 更加解耦.方便.在实际项目中,spr ...
- hbase源码系列(十四)Compact和Split
先上一张图讲一下Compaction和Split的关系,这样会比较直观一些. Compaction把多个MemStore flush出来的StoreFile合并成一个文件,而Split则是把过大的文件 ...
- hbase源码系列(八)从Snapshot恢复表
在看这一章之前,建议大家先去看一下snapshot的使用.这一章是上一章snapshot的续集,上一章了讲了怎么做snapshot的原理,这一章就怎么从snapshot恢复表. restoreSnap ...
随机推荐
- Mac下安装mysql8.0.11
1.下载MySQL Community 版本:8.0.11,本次例子是以dmg安装的方式,下载的文件名为:mysql-8.0.11-macos10.13-x86_64.dmg 下载地址:https:/ ...
- H.264 RTP PAYLOAD 格式
H.264 视频 RTP 负载格式 1. 网络抽象层单元类型 (NALU) NALU 头由一个字节组成, 它的语法如下: +---------------+ |0|1|2|3|4|5|6|7 ...
- 实现session(session数据)的共享,解决分布式session共享
为什么要实现共享? 首先我们应该明白,为什么要实现共享,如果你的网站是存放在一个机器上,那么是不存在这个问题的,因为会话数据就在这台机器,但是如果你使用了负载均衡把请求分发到不同的机器呢?这个时候会话 ...
- Java:多线程,CyclicBarrier同步器
1. 背景 CyclicBarrier类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此 ...
- Atitit 图像处理 halcon类库的使用 范例边缘检测 attilax总结
Atitit 图像处理 halcon类库的使用 范例边缘检测 attilax总结 1.1. 安装halcon11 ..体积大概1g压缩模式1 1.2. Halcon的科技树1 1.3. 启动 &qu ...
- python2和Python3异同总结
1. python3 异常不再接收逗号(,)作为参数: ## python3 中这样可以正常运行 try: print("在这里执行的代码,有异常进入except") except ...
- http缓存机制之304状态码
在网上看到一篇关于解释浏览器缓存更新机制304状态码的文章,里面说如果请求头中的If-Modified-Since字段和If-None-Match字段的值分别和响应头中的Last-Modified字段 ...
- git clean 小结
删除 一些 没有 Git add 的 文件: git clean 参数 -n 显示 将要 删除的 文件 和 目录 -f 删除 文件,-df 删除 文件 和 目录 git clean -n git c ...
- spark 分区
http://stackoverflow.com/questions/39368516/number-of-partitions-of-spark-dataframe
- c--日期和时间函数
C的标准库<time.h>包含了一些处理时间与日期的函数. 1.clock_t clock(void); 函数返回程序自开始执行后的处理器时间,类型是clock_t,单位是tick.如果有 ...