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)来压缩一下内存中的大小,这个后面后面会讲到。

时间: 2024-10-13 16:20:11

hbase数据模型以及编码压缩(转)的相关文章

Hbase总结(一)-hbase命令,hbase安装,与Hive的区别,与传统数据库的区别,Hbase数据模型

Hbase总结(一)-hbase命令 下面我们看看HBase Shell的一些基本操作命令,我列出了几个常用的HBase Shell命令,如下: 名称 命令表达式 创建表 create '表名称', '列名称1','列名称2','列名称N' 添加记录 put '表名称', '行名称', '列名称:', '值' 查看记录 get '表名称', '行名称' 查看表中的记录总数 count  '表名称' 删除记录 delete  '表名' ,'行名称' , '列名称' 删除一张表 先要屏蔽该表,才能对

HBase 数据模型及读写操作

一.HBase数据模型 HBase是一个类似于BigTable的分布式数据库,它是一个稀疏的长期存储的(存在HDFS上).多维度的.排序的映射表.这张表的索引是行关键字.列关键字和时间戳.HBase的数据都是字符串,没有类型. 例:       可以将一个表想象成一个大的映射关系,通过行键.行键+时间戳或行键+列(列族:列修饰符),就可以定位特定数据.由于HBase是稀疏存储数据的,所以某些列可以是空白的.上表给出了 com.cnn.www 网站的数据存放逻辑视图,表中仅有一行数据,行的唯一标识

从零自学Hadoop(21):HBase数据模型相关操作下

阅读目录 序 变量 数据模型操作 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 序 上一篇,我们讲述了HBase的数据模型相关操作的上部分.   下面我们开始介绍HBase的数据模型相关操作的下部分. 变量 一:定义变量 这样我们就可以使用t这个变量来代替table1了. t=get_table 'table1' 二:使用 t.put 'row1','cf1:a','v1' t.g

编码压缩标准与视频格式

MPEG-4是一套用于音频.视频信息的压缩编码标准,由国际标准化组织(ISO)和国际电工委员会(IEC)下属的"動態影像专家组"(Moving Picture Experts Group,即MPEG)制定,第一版在1998年10月通過,第二版在1999年12月通過.MPEG-4格式的主要用途在於網上串流.光碟.語音傳送(視訊電話),以及電視廣播.(摘自Wikipedia) H.264被MPEG组织称作AVC(Advanced Video Codec/先进视频编码),是MPEG4标准的第

hbase的四种压缩格式

Hbase支持的压缩格式: hbase支持的压缩格式:GZ(GZIP),LZ0,LZ4,Snappy GZ:用于冷数据压缩,与Snappy和LZ0相比,GZIP的压缩率更高,但是更消耗CPU,解压/压缩速度更慢. Snappy和LZ0:用于热数据压缩,占用CPU少,解压/压缩速度比GZ快,但是压缩率不如GZ高. Snappy与LZ0相比,Snappy整体性能优于LZ0,Snappy压缩率比LZ0更低,但是解压/压缩速度更快. LZ4与LZ0相比,LZ4的压缩率和LZ0的压缩率相差不多,但是LZ4

从零自学Hadoop(20):HBase数据模型相关操作上

阅读目录 序 介绍 命名空间 表 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 序 上一篇,我们讲述了HBase的介绍及安装,从列图和引用的方式,列举的HBase能做什么及一些特点,也截图了HBase的安装过程.   下面我们开始介绍HBase的数据模型相关操作,该部分内容较多,分成两个部分. 介绍 一:Data Model Data Model包括Table(表),Row(行),

HBase里配置SNAPPY压缩以后regionserver启动不了的问题

配置了HBase的SNAPPY压缩以后,出现regionserver启动不了的问题.分析应该是属性配置错了! 官网上的是:<name>hbase.regionserver.codecs</name>, 实际上应该是<name>io.compression.codecs</name> 修改配置以后就可以启动了. 原文地址:https://www.cnblogs.com/nanguyan/p/8128042.html

CDH5.5.1版HBase安装使用LZO压缩

1.安装 RHEL/CentOS/Oracle 5 Navigate to this link and save the file in the /etc/yum.repos.d/ directory. RHEL/CentOS/Oracle 6 Navigate to this link and save the file in the /etc/yum.repos.d/ directory. RHEL/CentOS/Oracle 7 Navigate to this link and save

HBase数据模型

HBase以表的形式存储数据.表由行和列族组成.列划分为若干个列族(row family),其逻辑视图如下: 下面分别说说几个关键概念: 1.行键(RowKey) 行键是字节数组, 任何字符串都可以作为行键: 表中的行根据行键进行排序,数据按照Row key的字节序(byte order)排序存储: 所有对表的访问都要通过行键 (单个RowKey访问,或RowKey范围访问,或全表扫描) 2.列族(ColumnFamily) CF必须在表定义时给出 每个CF可以有一个或多个列成员(ColumnQ