HBase学习笔记——高表与宽表的选择

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。

时间: 2024-12-31 05:00:46

HBase学习笔记——高表与宽表的选择的相关文章

ORACLE学习笔记-新建用户及建表篇_oracle

一.用户相关SQL语句 /*新建用户*/ create user SA identified by 2013; 说明:SA用户名,2013密码 /*授权connect,resource给用户sa*/ grant connect,resource to sa; 说明:CONNECT角色: --是授予最终用户的典型权利,最基本的 .         ESOURCE 角色: --是授予开发人员的 /*查询所有的用户*/ select * from all_users; /*将表STU查询权限授予SA*

HBase学习笔记——避免热点Region的一些技巧

HBase row key设计得不好.频度各异的查询类型,会导致热门数据集中坐落在某几个Region上,造成Region热点,集群负载不均衡. 能采取哪些解决方案,首先要明确访问模式,然后针对性优化: 牺牲有序性,散列化row key. 如果不需要数据的有序性: 在row key首部增加原始row key的hash code,使数据均匀散列. 或者,将原始row key的MD5作为实际的row key. 对整个row key散列牺牲了有序性和根据前缀匹配进行范围扫描的能力. 为此,我们也可以对r

HBase学习笔记——基于HBase的日志系统的性能优化

我之前参与过一个日志系统的开发,存储用HBase.我简单罗列下用到的HBase优化,备忘.以后把它整理成更友好的介绍性文章. 系统简介 有一张大的日志数据表,保存所有日志.row key是 hash + app id + log-severity + timestamp + host等,cell保存日志正文数据. 可以看到row key的hash保证日志散列在各个region中,写入.查询的负载均衡.但是无法通过它进行范围查询,所以为不同查询模式,建立了多张索引表. 为不同的日志级别(DEBUG

横表与竖表性能浅析

概念介绍 横表概念   横表就是普通的建表方式,每一个字段代表一个KPI指标.举个列子,一个学生的成绩表:学号.数学成绩.语文成绩.英语成绩. 物理成绩.化学成绩......如下所示: SQL> DESC STUDENT_SCORE Name Type Nullable Default Comments ---------------- ---------- -------- ------- -------- STUDENT_NO NUMBER(10) 学号 CHINESE_SCORE NUMB

HBase学习总结(5):HBase表设计

一.如何开始模式设计 当我们说到模式(schema),要考虑以下内容: (1)这个表应该有多少个列族? (2)列族使用什么数据? (3)每个列族应该有多少列? (4)列名应该是什么?(尽管列名不必在建表时定义,但是读写数据时是需要知道的.) (5)单元存放什么数据? (6)每个单元存储多少个时间版本? (7)行键结构是什么?应该包括什么信息? 1.问题建模 一个特定列族的所有数据在HDFS上会有一个物理存储.这个物理存储可能由多个HFile组成,理想情况下可以通过合并得到一个HFile.一个列族

VSTO学习笔记(十四)Excel数据透视表与PowerPivot

原文:VSTO学习笔记(十四)Excel数据透视表与PowerPivot 近期公司内部在做一种通用查询报表,方便人力资源分析.统计数据.由于之前公司系统中有一个类似的查询使用Excel数据透视表完成的,故我也打算借鉴一下. 测试代码下载    原有系统是使用VBA编写的,难以维护,且对新的操作系统如Windows 7.64位架构不支持,我准备用VSTO进行重写. 数据透视表是一种交互式的表,可以进行某些计算,如求和与计数等.所进行的计算与数据跟数据透视表中的排列有关. 数据透视表是一种完全自助式

Spring学习笔记2之表单数据验证、文件上传实例代码_java

在上篇文章给大家介绍了Spring学习笔记1之IOC详解尽量使用注解以及java代码,接下来本文重点给大家介绍Spring学习笔记2之表单数据验证.文件上传实例代码,具体内容,请参考本文吧! 一.表单数据验证 用户注册时,需要填写账号.密码.邮箱以及手机号,均为必填项,并且需要符合一定的格式.比如账号需要32位以内,邮箱必须符合邮箱格式,手机号必须为11位号码等.可以采用在注册时验证信息,或者专门写一个工具类用来验证:来看下在SpringMVC中如何通过简单的注释实现表单数据验证. 在javax

VSTO学习笔记(八)向 Word 2010 中写入表结构

原文:VSTO学习笔记(八)向 Word 2010 中写入表结构 前几天公司在做CMMI 3级认证,需要提交一系列的Word文档,其中有一种文档要求添加公司几个系统的数据库中的表结构.我临时接到了这项任务,辅助相关人员完成这种文档. 示例代码下载 本系列所有示例代码均在 Visual Studio 2010 Ultimate RTM + Office 2010 Professional Plus RTM x64 中测试通过 注:本次使用的数据库为 SQL Server 2008 R2 DataC

MySQL学习笔记之创建、删除、修改表的方法_Mysql

本文实例讲述了MySQL学习笔记之创建.删除.修改表的方法.分享给大家供大家参考,具体如下: 创建表: create table users( id int, name varchar(64), sex bit(1), birthday date, Entry_date date, job varchar(32), salary float, resume text ); 1 添加列: alter table 表名 add 列名 数据类型 alter table users add image