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

简介: hbase是一个KeyValue型的数据库,在《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 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情: https://cn.aliyun.com/product/hbase   ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
4月前
|
Java Shell 分布式数据库
【大数据技术Hadoop+Spark】HBase数据模型、Shell操作、Java API示例程序讲解(附源码 超详细)
【大数据技术Hadoop+Spark】HBase数据模型、Shell操作、Java API示例程序讲解(附源码 超详细)
84 0
|
4月前
|
机器学习/深度学习 分布式计算 Hadoop
一种HBase表数据迁移方法的优化
一种HBase表数据迁移方法的优化
50 0
|
3月前
|
存储 NoSQL Java
HBase的数据模型是什么样的?
HBase的数据模型是什么样的?
30 0
|
4月前
|
NoSQL 分布式数据库 数据库
分布式NoSQL列存储数据库Hbase_列族的设计(五)
分布式NoSQL列存储数据库Hbase_列族的设计(五)
199 0
|
9月前
|
存储 分布式计算 NoSQL
分布式数据库HBase的基本概念和架构之基本数据模型的Cell
HBase是一个分布式数据库系统,基于Google的Bigtable和Apache Hadoop的HDFS构建而成。它是一个分布式数据库的NoSQL数据库,主要用于存储和处理海量数据。HBase的核心特性包括高可用性、高性能和高伸缩性。在阿里云开发者社区中,我们将介绍HBase的基本概念和架构,以及它的基本数据模型Cell。
547 0
|
9月前
|
存储 分布式计算 NoSQL
分布式数据库HBase的基本概念和架构之基本数据模型的Row
HBase是一个分布式数据库系统,基于Google的Bigtable和Apache Hadoop的HDFS构建而成。
210 0
|
5月前
|
存储 NoSQL 分布式数据库
94 hbase数据模型
94 hbase数据模型
25 0
|
9月前
|
存储 Java Shell
分布式数据库HBase的常用操作的基本Shell命令的表操作
HBase是一个分布式数据库系统,支持高性能、可伸缩、实时的数据存储和处理。在HBase中,我们可以使用Shell命令来进行常用的操作,如创建表、插入数据、查询数据、更新数据等。本文将介绍关于分布式数据库HBase的常用操作基本Shell命令的表操作。
133 0
|
9月前
|
存储 分布式计算 NoSQL
分布式数据库HBase的基本概念和架构之基本数据模型的TimeStamp
HBase是一个分布式数据库系统,基于Google的Bigtable和Apache Hadoop的HDFS构建而成。
358 0
|
9月前
|
存储 分布式计算 NoSQL
分布式数据库HBase的基本概念和架构之基本数据模型的Table
HBase是一个分布式数据库系统,基于Google的Bigtable和Apache Hadoop的HDFS构建而成。

相关实验场景

更多