一、宽表和高表定义

HBase 中的表可以设计为高表(tall-narrow table) 和 宽表(flat-wide table):

(1) 宽表是指很多列较少行,即列多行少的表,一行中的数据量较大,行数少;

(2) 高表是指很多行较少列,即行多列少,一行中的数据量较少,行数大。

二、宽表和高表的优劣

HBase的键分为两种:

(1) 列键:包括了列族名和限定符,定位到列的索引

(2) 行健:相当于关系型数据库中的主键,通过行健得到逻辑布局中一行的所有列

由于列键是由列族名和限定符组成的,属于定位具体 StoreFile 的,所以应该将需要查询的维度或者信息存储在 row key 中,因为用它来筛选数据效率最高!

Hbase 的 row key 是分布式的索引,也是分片的依据。Hbase 的 row key + column family + column qualifier + timestamp + value 是 HFile 中数据排列依据。

据此,在HBase中使用宽表、高表的优劣总结如下:

(1) 查询性能:高表查询更好,因为查询条件都在 row key 中,是全局分布式索引的一部分。高表一行中的数据较少。所以查询缓存 BlockCache 能缓存更多的行,以行数为单位的吞吐量会更高。

(2) 分片能力:高表分片粒度更细,各个分片的大小更均衡。HBase按行来分片,高表一行的数据较少,宽表一行的数据较多。

(3) 元数据开销:高表元数据开销更大。高表行多,row key 多,可能造成region 数量也多,- root -、 .meta 表数据量更大。过大的元数据开销,可能引起 HBase 集群的不稳定、master 更大的负担。

(4) 事务能力:宽表事务性更好。HBase对一行的写入(Put)是有事务原子性的,一行的所有列要么全部写入成功,要么全部没有写入。但是多行的更新之间没有事务性保证。

(5) 数据压缩比:如果我们对一行内的数据进行压缩,宽表能获得更高的压缩比。因为宽表中,一行的数据量较大,往往存在更多相似的二进制字节,有利于提高压缩比。通过压缩,缓解了宽表一行数据量太大,并导致分片大小不均匀的问题。查询时,根据 row key 找到压缩后的数据,进行解压缩。而且解压缩可以通过协处理器(coproesssor)在 HBase 服务器上做,而不是在业务应用的服务器上做,以充分应用 HBase 集群的CPU能力。

三、宽表和高表的应用场景

3.1、高表的应用

在一个电子邮箱系统中,将行健设置为用户的唯一ID,其余属性作为列族或者列族中的列,如此一来,同一个用户的所有邮件信息都会被存储在同一行中(因为他们的行健相同),这在大部分情况下是通用的,但是有些用户的邮件数量非常非常大,大到一行数据就超出了HFile 的最大限度,这样一来,宽表设计方式就出现了致命的缺陷:表数据无法拆分,更无法进行 HBase 的负载均衡等特性。

PS:也许会有疑问,HFile 和 Region 达到一定大小的时候不是会自动切分的吗? 这是因为HBase 只能按行切分,当行数量达到阈值的时候会根据行健进行切分。

解决这个问题更好的办法是代替宽表,设计一个高表: 可以将行健设置为用户Id + 邮件Id,这样一来,每封邮件都是单独的一行,将宽表中的行数据释放出来。

这样做的好处是:

(1) 行数量可以更容易的被拆分;

(2) 行健中包含关键的筛选信息(邮件 Id 被移到了 row key),用户可以直接根据行健定位到唯一的一封邮件;

(3) 拥有很好的扩展性,高表也是推荐的用法。

但是要使用高表还是宽表还要根据具体的业务场景来确定,因为在以上高表的设计中,同一用户的数据分布在多行中,用户不可能在一个简单的操作中修改一个收件箱的全局属性,因为这涉及到了原子性的操作,如果用户没有一次修改整个收件箱的需求时,这种设计是非常合适的,但是如果用户真的有这种需求,而且需求很大,那么宽表反而更加合适,因为 HBase 能够保证行级别的原子性。

3.2、宽表的应用

Hbase 宽表可以应用在社区系统中,比如 BBS:可以用帖子的 Url 地址作为row key 保存,而后面的每一个回复,作为列族中单独的列。回复越多,列族中单独的列就越多,表就变宽了。

设计表时,可以不绝对追求高表、宽表,而是在两者之间做好平衡。根据查询模式,需要分布式索引、分片、有很高选择度(即能据此查询条件迅速锁定很小范围的一些行)的查询用字段,应该放入row key;能够均匀地划分数据字节数的字段,也应该放入 row key,作为分片的依据。选择度较低,并且不需要作为分片依据的查询用字段,放入 column family 和 column qualifier,不放入row key。

HBase-宽表和高表的对比的更多相关文章

  1. Hadoop HBase概念学习系列之HBase里的高表设计概念(表设计)(二十八)

    在下面这篇博文里,我给各位博客们,分享了创建HBase表,但这远不止打好基础. HBase编程 API入门系列之create(管理端而言)(8) 在关系型数据库里,表的高表和宽表是不存在的.在如HBa ...

  2. SQL Server 堆表与栈表的对比(大表)

    环境准备 使用1个表,生成1000万行来进行性能对比(勉强也算比较大了),对比性能差别. 为了简化过程,不提供生成随机数据的过程.该表初始为非聚集索引(堆表),测试过程中会改为聚集索引(栈表). CR ...

  3. hbase操作(shell 命令,如建表,清空表,增删改查)以及 hbase表存储结构和原理

    两篇讲的不错文章 http://www.cnblogs.com/nexiyi/p/hbase_shell.html http://blog.csdn.net/u010967382/article/de ...

  4. hive-内部表和外部表 对比

    建表时,需要考虑究竟建内部表还是外部表,内部表和外部表都有哪些不同? 内部表: 1. 数据存储位置:数据最终会被移动到 hive.metastore.warehouse.dir指定的路径下,以表名创建 ...

  5. Hadoop HBase概念学习系列之META表和ROOT表(六)

    在 HBase里的HRegion 里,谈过,HRegion是按照表名+开始/结束主键,即表名+主键范围来区分的.由于主键范围是连续的,所以一般用开始主键就可以表示相应的HRegion了. 不过,因为我 ...

  6. ORACLE创建表之前判断表是否存在与SQL Server 对比使用

    在SQL Server 数据库中,我们在创建表之前删除表,有if exit()这样的语句,但是在oracle中却没有.如果直接使用drop table那么如果表不存在会报错,导致后续语句无法运行.因此 ...

  7. Oracle和MySQL的高可用方案对比【转】

    关于Oracle和MySQL的高可用方案,其实一直想要总结了,就会分为几个系列来简单说说.通过这样的对比,会对两种数据库架构设计上的细节差异有一个基本的认识.Oracle有一套很成熟的解决方案.用我在 ...

  8. Mysql优化原则_小表驱动大表IN和EXISTS的合理利用

    //假设一个for循环 ; $i < ; $i++) { ; $i < ; $j++) { } } ; $i < ; $i++) { ; $i < ; $j++) { } } ...

  9. Hive 文件格式 & Hive操作(外部表、内部表、区、桶、视图、索引、join用法、内置操作符与函数、复合类型、用户自定义函数UDF、查询优化和权限控制)

    本博文的主要内容如下: Hive文件存储格式 Hive 操作之表操作:创建外.内部表 Hive操作之表操作:表查询 Hive操作之表操作:数据加载 Hive操作之表操作:插入单表.插入多表 Hive语 ...

  10. MySQL表结构,表空间,段,区,页,MVCC

    索引组织表(IOT表):为什么引入索引组织表,好处在那里,组织结构特点是什么,如何创建,创建IOT的限制LIMIT. IOT是以索引的方式存储的表,表的记录存储在索引中,索引即是数据,索引的KEY为P ...

随机推荐

  1. Angular系列教程之观察者模式和RxJS

    .markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...

  2. [转帖]Kubernetes 1.23:IPv4/IPv6 双协议栈网络达到 GA

    https://kubernetes.io/zh-cn/blog/2021/12/08/dual-stack-networking-ga/#:~:text=Kubernetes%201.23%EF%B ...

  3. [转帖]Export Prometheus metrics from SQL queries

    https://github.com/albertodonato/query-exporter query-exporter is a Prometheus exporter which allows ...

  4. [转帖]SkyWalking告警使用

    SkyWalking告警 SkyWalking提供了强大的监控告警功能,在监控到应用出现问题的时候,会调用webhook或者gRPC hook或者Wechat DingDing等工具报告警告信息 而且 ...

  5. [转帖]linux audit审计(7-1)--读懂audit日志

    https://www.cnblogs.com/xingmuxin/p/8807774.html  auid=0 auid记录Audit user ID,that is the loginuid.当我 ...

  6. [转帖]在 TiDB 中正确使用索引,性能提升 666 倍

    https://tidb.net/book/tidb-monthly/2022/2022-04/usercase/index-666 背景​ 最近在给一个物流系统做TiDB POC测试,这个系统是基于 ...

  7. [转帖]KingbaseES不同字符类型比较转换规则

    https://www.cnblogs.com/kingbase/p/14798059.html Postgresql 常用的字符数据类型的有char.varchar和text,其中 char 固定长 ...

  8. [转帖]Pepper-Box - Kafka Load Generator

    https://github.com/GSLabDev/pepper-box Pepper-Box is kafka load generator plugin for jmeter. It allo ...

  9. [转帖]深入理解mysql-第十一章 mysql查询优化-Explain 详解(中)

    一.执行计划-type属性 执行计划的一条记录就代表着MySQL对某个表的执行查询时的访问方法,其中的type列就表明了这个访问这个单表的方法具体是什么,比方说下边这个查询: mysql> EX ...

  10. elementui中el-checkbox 选中时的详细介绍

    checkbox-group 把多个checkbox管理为一组(需要注意的坑) 很多时候我们需要会遇见这样的场景. 比如用户需要选择多个值. 这个时候我们需要把多个 checkbox 放置在check ...