Hbase学习之概念与原理
一、hbase与列式存储
hbase最早起源于谷歌的一篇BigTable的论文,它是由java编写的、开源的一个nosql数据库,同时它也是一个列式存储的、支持分布式(基于hdfs)的数据库。什么是列式存储呢?简单来讲就是:传统的关系数据库几乎都是行式存储的,这种存储的特点是,将每一行的数据连起来进行存储;而列式存储是将每一列的数据连起来进行存储的。
列式存储相对于行式存储有哪些优点呢?
1.压缩空间:一张表里面,我存储的数据可以是非常松散的,就是说这一列可以有值也可以没有值,没有值就不会占用空间,而行式存储不行,它的结构非常规范,就算是某一列不赋值,那么这一行的这一列空间也是占用的,而且后期如果我想对某张表扩张字段的话,前面的的数据都必须强制开辟这个字段的存储空间。
2.查询性能:行式存储在查询的时候若我们制定某一个字段进行查询,他会遍历这一行的所有字段,然后找到匹配的字段进行返回,这样是很耗费IO的,而列式存储由于它本来就是按列来进行数据存储的,就是说不同的列的数据是存储在不同地方的,所以检索指定列的时候只需要找到对应的列存储的位置,然后针对性检索就行了。
二、hbase的表结构
既然hbase是一个数据库,那么必然会有表的概念,它也有行键和列名的概念,不过与传统关系数据库不同的是它引入了列族的概念。
hbase的表分为两类,一类的系统表(又称meta表),另一类是用户表。meta表由系统创建与维护,主要存储表和分区的元数据信息,用户权限等。而用户表是我们自己创建的表,我们用户用来存储业务数据的表。
hbase的表里面有很多概念:行、列、行键、单元格、值、时间戳等。
如下图所示是一张hbase表,RowKey就是行键的概念,一行只有一个用来作为唯一标示。同时下图有两个列族,CF1和CF2,在它们下面又各有两个列,分别是name/age和sex/class,每一个行可以有多个时间戳标示不同的版本,例如下面的00001就有3个不同的时间戳版本,而hbase在查询的时候默认是获取最新的时间戳版本的数据。由rowkey、列(clomun)、timestamp可以确定一个唯一的单元格,如00001的t1时间的name是zhangsan。

同时我们可以看到有些列里面是没有值的,而hbase只对于有值的列存储进文件系统。
这里有一个rowkey排序的问题,hbase是根据rowkey的字节值进行数据排序的,且rowkey一般都是字符串形式存储的,存储的时候会将字符串转换为二进制流。也就是说,对于这里的rowkey00001和00002来说,00001是排在00002前面的。同时由于这么一个排序的问题,如果rowkey的设计不合理的话,很有可能会导致hbase的热点问题。
三、hbase的表存储
下图是hbase的一个table的存储结构,一个table有一个或者多个region组成,这也是hbase能够支持分布式存储的重要原因。同时一个region里由一个或者多个列族组成,一个列族有一个store实体组成,store实体里面有MEMStore、HFil,MEMStore是内存实体,HFile是实际的存储物理文件,HFile里面又由多个block组成,block里面存储的就是单元格数据cell。

Region
如果是单机的话,所有行和列组成的单元格数据全部存储在一张表中就可以了,但是hbase为了支持集群分布式,就必须把一张很大的表拆分成多个region。每个region都有一个起始的rowkey和一个结束的rowkey来定义它的边界。同时每个region里面存储的那些rowkey都会保存在hbase的meta表中,查询的时候可以通过meta数据快速定位到需要查询的rowkey数据在哪个region里面。hbase里面有一个regionserver的角色,每个region会被分配到各自的regionserver中,这个是有hbase的负载均衡器自动完成的。同时当某个region很大的时候,它是可以分裂的,当然如果有需要,多个小的region也是可以合并的。
列族
列族是hbase独有的概念,在同一个region里面,不同的列族的数据会存储在不同的文件中。而列族如何分配,可以根据存储的数据的类型来决定,不同类型的数据可以存储在不同的列族中,如文本数据和图片数据就可以分开存储。
但是列族数量不宜过多,因为有一个列族就会有一个store,而region达到一定的大小之后就会进行分裂,这个时候列族过多就会出现问题。
例如:一个region里面有列族A和列族B,A有1000万数据,而B有10万数据,当region到达设定的阈值之后开始执行分裂,假设分裂为10份。那么对于列族A来说每一份就是有100万数据,但是对于B来说每一份就只有1万数据,那么当去检索B的数据的时候就需要遍历很多region从而导致性能降低。
Store
一个store对应一个列族。store对象由memstore和hfile组成,memstore是数据写入的缓存区,而hflie是物理文件。数据写进来的时候首先进入到memstore里面,当memstore达到一定的阈值的时候Hfile就会被创建。
Block
Hflie是由block组成的,这里的block与hdfs的block不同,一个hdfs的block可能会包含多个hfile的block。
四、Hbase的角色
hbase在集群的情况下主要有两个角色:HMaster和RegionServer。
HMaster
职责:1.Region分配 2.负载均衡 3.RegionServer恢复 4.监控Region分裂 5.追踪活跃或者宕机的服务器
RegionServer
RegionServer是托管并且服务Region以及Hbase数据的应用程序。
如下图所示是一个9台的hbase集群,其中3台主机,6台从机。主机上面运行Hmaster,hdfs的NN服务,以及zk服务,而从机上面运行RegionServer服务以及hdfs的DN服务。我们连接hbase进行读写的时候都是先连接主机的zk,然后zk找到对应的master服务器,然后master服务器通过meta数据找到数据在哪个region上面,然后找到这个region在具体哪个regionserver上面并且建立连接,由regionserver再执行数据操作。

五、总结
关于hbase的概念呢以及存储结构就写这些好了,其实上面还有很多东西没写到,比如分裂合并的流程,读写流程什么的,同时我们在实际应用hbase的时候也有很多技巧,比如rowkey设计,二级索引等,如果不懂hbase的原理的话,在使用的时候经常会踩很多坑,如果有写的不对的地方也请大家多多指正,谢谢。
Hbase学习之概念与原理的更多相关文章
- HBase学习笔记——概念及原理
1.什么是HBase HBase – Hadoop Database,是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群. ...
- Java IO学习笔记:概念与原理
Java IO学习笔记:概念与原理 一.概念 Java中对文件的操作是以流的方式进行的.流是Java内存中的一组有序数据序列.Java将数据从源(文件.内存.键盘.网络)读入到内存 中,形成了 ...
- HBase学习(一) 基本概念和安装基本命令
HBase学习(一) 一.了解HBase 官方文档:https://hbase.apache.org/book.html 1.1 HBase概述 HBase 是一个高可靠性.高性能.面向列.可伸缩的分 ...
- HBase学习(四) 二级索引 rowkey设计
HBase学习(四) 一.HBase的读写流程 画出架构 1.1 HBase读流程 Hbase读取数据的流程:1)是由客户端发起读取数据的请求,首先会与zookeeper建立连接2)从zookeepe ...
- Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之ORACLE集群概念和原理(二)
ORACLE集群概念和原理(二) 概述:写下本文档的初衷和动力,来源于上篇的<oracle基本操作手册>.oracle基本操作手册是作者研一假期对oracle基础知识学习的汇总.然后形成体 ...
- Java中的泛型 (上) - 基本概念和原理
本节我们主要来介绍泛型的基本概念和原理 后续章节我们会介绍各种容器类,容器类可以说是日常程序开发中天天用到的,没有容器类,难以想象能开发什么真正有用的程序.而容器类是基于泛型的,不理解泛型,我们就难以 ...
- Java线程:概念与原理
Java线程:概念与原理 一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程 ...
- RabbitMQ基本概念和原理
RabbitMQ基本概念和原理 1.AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计. 2.Rabb ...
- 【转】Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之ORACLE集群概念和原理(二)
阅读目录 目录 Oracle集群概念和原理 RAC概述 RAC 集成集群件管理 RAC 的体系结构 RAC 的结构组成和机制 RAC 后台进程 RAC 共享存储 RAC 数据库和单实例数据库的区别 ...
随机推荐
- Android Parcelable using Kotlin
Kotlin 有 extension 可以很方便的让类继承 Parcelable 接口. 项目中引入一个较新版本的 Kotlin 引入 Kotlin extensions classpath &quo ...
- python--partial偏函数
new_func = partial(函数名,参数), 生成一个新的函数, 新的函数中参数是partial固定时的参数 例1: from functools import partial def f ...
- 设计模式《JAVA与模式》之备忘录模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述备忘录(Memento)模式的: 备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式. 备忘录 ...
- postgresql-hdd,ssd,效率
既有ssd又有hdd是将数据存储到ssd还是将索引存储到ssd的效率更高呢? 一种说法是索引是随机扫描,将索引放入ssd效率会增高, 一种说法是将数据放入ssd效率更高 最好的情况是将数据和索引都 ...
- 05-01 Java 方法
方法 方法定义.格式: /* 方法:完成特定功能的代码块. 注意:在很多语言里面有函数的定义,而在Java中函数被称为方法. 方法格式: 修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数 ...
- odoo开发笔记--字段追踪,消息通知机制
odoo有着强大的消息记录.通知机制: 实际开发中,常常会有客户的需求,页面上form视图中的某些字段不允许反复修改, 假如有的用户修改了,恶意搞坏,往往容易给公司利益造成损失,或破坏,那么如何有效的 ...
- 了解fortran语言
最近看了一些文献,发现用了Fortran语言编程,并且还是近几年的,了解了之后才知道,其实Fortran已经慢慢没有人再用了,之所有还有一批人在用,极大可能是历史遗留问题吧.而这,也得从Fortran ...
- c++中文件读取
对于C++编译运行文件,我使用过两个编译器,一个是visual studio 2013,另外一个是devcpp,推荐使用devcpp. vs的特点是界面整洁清晰,但是需要收费,这是微软的,并且在电脑上 ...
- Javac中的方法
例1: interface IA{ void m(int a); } abstract class AC implements IA{ // 这个抽象方法覆盖了 IA中的方法m public abst ...
- 观察者模式——java设计模式
观察者模式 定义:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 1.观察者模式的结构 ( ...