hbase数据模型以及编码压缩(转)
原文链接: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 数据模型(Data Model)
HBase Data Model--HBase 数据模型(翻译) 在HBase中,数据是存储在有行有列的表格中.这是与关系型数据库重复的术语,并不是有用的类比.相反,HBase可以被认为是一个多维度的 ...
- HBase 数据模型
在HBase中,数据是存储在有行有列的表格中.这是与关系型数据库重复的术语,并不是有用的类比.相反,HBase可以被认为是一个多维度的映射. HBase数据模型术语 Table(表格) 一个HBase ...
- HBase数据压缩算法编码探索
摘要: 本文主要介绍了hbase对数据压缩,编码的支持,以及云hbase在社区基础上对数据压缩率和访问速度上了进行的改进. 前言 你可曾遇到这种需求,只有几百qps的冷数据缓存,却因为存储水位要浪费几 ...
- Hbase总结(一)-hbase命令,hbase安装,与Hive的区别,与传统数据库的区别,Hbase数据模型
Hbase总结(一)-hbase命令 下面我们看看HBase Shell的一些基本操作命令,我列出了几个常用的HBase Shell命令,如下: 名称 命令表达式 创建表 create '表名称', ...
- HBase数据模型
上次我们讲过了<HBase简介>,点击阅读有助于更好地理解本文.本文讲述的是HBase数据模型. 1.ROW KEY 决定一行数据按照字典顺序排序的.Row key只能存储64k的字节数据 ...
- HBase数据模型(2)
HBase数据模型(1) HBase数据模型(2) 1.0 HBase的版本version,是一个用长整型表示的.由Rowkey.Column(列族和列).Version组合在一起称为HBase中的一 ...
- HBase数据模型(1)
HBase数据模型(1) HBase数据模型(2) 1.0 HBase的特性 Table HBase以表(Table)的方式组织数据,数据存储在表中. Row/Column 行(Row)和列(Colu ...
- 3.Hbase数据模型
3.1.Hbase数据模型: 概念视图: 物理视图 Hbase数据在存储系统中是以列族来体现的[Column Family],任何时候可以随意的添加一列到已经存在的列族中 空的单元格在表中不做存储也不 ...
- 从零自学Hadoop(20):HBase数据模型相关操作上
阅读目录 序 介绍 命名空间 表 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 序 ...
随机推荐
- kafka和springboot整合应用
加载依赖 <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>s ...
- redis 发布/订阅 模式
发布/订阅模式的命令如下: * 进入发布订阅模式的客户端,不能执行除发布订阅模式以上命令的其他命令,否则出错.
- 解决mongo 端口占用问题
在打开mongod之后如果不用了就按ctrl + c ,就不会出现以下的问题了 执行mongod报错 mongod 2016-08-03T14:31:15.691+0800 I CONTROL [in ...
- 分分钟搞定Python之排序与列表
排序时程序中用得比较多的方法了.在Python中,最简单的排序方法摸过与使用内置的sorted(list)这个函数了,该函数一一个列表作为参数返回一个新的列表,只不过是把旧列表中的元素排过序了.原列表 ...
- 2018/3/20 noip模拟赛 5分
T1 傻逼题,写了cmp没sort,5分. T2 树上差分,写了树剖线段树,超时,0分. T3 树归,0分. 我是个zz
- C++11中的raw string literals
作为一名C++书看得少得可怜的新手,我一直没有勇气去系统地学习一下C++ 11添加的新特性.不过,平日里逛论坛,阅读大犇们的博客,倒是了解了一些.比如,这个帖子: 如何绕过g++ 4.8.1那个不能在 ...
- Android 打包出现jdk版本错误的问题
Android 打包出现 jdk 版本错误的问题,本质上是 SDK 的问题,与 JDK 无关.如果 SDK 的 API 是24或者更高,就要求 jdk 1.8,我这里指定的 API 是22,所以去勾选 ...
- Vue-router浅识
一.router-link及router-view :用来做导航,通过传入to属性来指定链接 :用来做路由出口,路由匹配到的组件都会渲染在这里 const router = new VueRouter ...
- Codeforces Beta Round #11 B. Jumping Jack 数学
B. Jumping Jack 题目连接: http://www.codeforces.com/contest/11/problem/B Description Jack is working on ...
- Linux下LoadGenerator的搭建
前提说明: 测试架构:controller部署在windows操作系统下(windows下安装loadrunner的过程,可以去网上搜下,这里不做解释),loadgenerator部署在linux下. ...