首页 > 其他分享 >HBase-宽表和高表的对比

HBase-宽表和高表的对比

时间:2023-10-17 15:13:43浏览次数:28  
标签:高表 key 分片 HBase 宽表 row

HBase表设计通常可以是宽表(wide table)模式,即一行包括很多列。同样的信息也可以用高表(tall table)形式存储,通常高表的性能比宽表要高出 50%以上,所以推荐大家使用高表来完成表设计。表设计时,我们也应该要考虑HBase数据库的一些特性:

1、在HBase表中是通过Rowkey的字典序来进行数据排序的

2、所有存储在HBase表中的数据都是二进制的字节

3、原子性只在行内保证,HBase不支持跨行事务

4、列族(Column Family)在表创建之前就要定义好

5. 列族中的列标识(Column Qualifier)可以在表创建完以后动态插入数据时添加

hbase中的宽表是指很多列较少行,即列多行少的表,一行中的数据量较大,行数少;高表是指很多行较少列,即行多列少,一行中的数据量较少,行数大。

hbase的row key是分布式的索引,也是分片的依据。

hbase的row key + column family + column qualifier + timestamp + value 是HFile中数据排列依据。HFile据此,对数据的索引到data block级别,而不是行级别。所以这种key是HFile内部的粗粒度(data block粒度)本地索引的主键。

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

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

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

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

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

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

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

总结

在做Rowkey设计时,请先考虑业务是读比写多、还是读比写少,HBase本身是为写优化的,即便是这样,也可能会出现热点问题,而如果我们读比较多的话,除了考虑以上Rowkey设计原则外,还可以考虑HBase的Coprocessor甚至elastic search结合的方法,无论哪种方式,都建议做实际业务场景下数据的压力测试以得到最优结果

 

标签:高表,key,分片,HBase,宽表,row
From: https://www.cnblogs.com/yeyuzhuanjia/p/17769739.html

相关文章

  • HBase入门指南
    本文已收录至GitHub,推荐阅读......
  • 维度表 事实表 宽表 维表
    维度表事实表宽表  维表如何使用云数据库RDSMySQL版连接器_实时计算Flink版-阿里云帮助中心https://help.aliyun.com/zh/flink/developer-reference/apsaradb-rds-for-mysql-connector翻译搜索复制......
  • MapReduce和Spark读取HBase快照表
    1.概述随着大数据技术的不断发展,处理海量数据的需求变得愈发迫切。MapReduce作为一种分布式计算模型,为处理大规模数据提供了有效的解决方案。在这篇博客中,我们将探讨如何使用MapReduce框架读取快照表(SnapshotTable)的数据。快照表是一种记录某一时刻系统状态的表格,通过MapReduce......
  • 华为云HBase冷热分离最佳实践
    本文分享自华为云社区 《华为云HBase冷热分离最佳实践》,作者:pippo。HBase介绍HBase是HadoopDatabase的简称,是建立在Hadoop文件系统之上的分布式面向列的数据库,它具有高可靠、高性能、面向列和可伸缩的特性,提供快速随机访问海量数据能力。HBase采用Master/Slave架构,由HMast......
  • 20230922学习总结java连接HBASE
    连接条件:1、所有虚拟机上运行hadoop集群、运行zookeeper进程守护 2、向项目中导入即hbase安装目录下的conf文件夹中的两个文件 3、添加maven依赖<dependencies><dependency><groupId>org.apache.hbase</groupId><artifactId>hbase-server</ar......
  • HBase13(项目03phoenix视图JDBC开发)
    1.phoenix视图建立当创建视图后,就可以使用SQL查询视图,和操作Table一样。1.视图如何映射到HBase的表? 视图的名字必须是:命名空间.表名2.视图中的列如何映射到HBase的列族和列? 列名必须是:列族.列名3.视图中的类如何映射到HBase的ROWKEY? 指定某个列为primarykey,自动映射......
  • HBase学习12(项目02数据随机生成后写入Hbase里面)
    26~291.已完成创建hbase_shell目录用于存放hbaseshell脚本命名空间:MOMO_CHAT表名:MSG预分区6个,压缩方式'GZ'HBase学习11(项目01分析及准备)-201812-博客园(cnblogs.com) 2.导入pom依赖<repositories><!--代码库--><repository><id>aliyun</id>......
  • HBase学习11(项目01分析及准备)
    海量数据1.准备在idea中创建项目,然后创建脚本包hbase_shell。添加文件说明readme.md,写入相关项目结构说明。通过复制hbase_shell文件目录,在VSCode中打开进行对脚本文件的编写。在VSCode中编写方便。 2.创建名称空间namespace当表的数量比较多的时候,为了方便管理,不同的业......
  • HBASE shell学习
    一、基本命令打开HbaseShell:#hbaseshell1.1获取帮助#获取帮助help#获取命令的详细信息help'status'1.2查看服务器状态status1.3查看版本信息version关于表的操作2.1查看所有表list2.2创建表命令格式:create'表名称','列族名称1','列族名称2','列名称N'#创建......
  • hbase初识
    一、HBase是一个分布式的、面向列的开源数据库。一个结构化数据的分布式存储系统”。HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而......