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 数据库和单实例数据库的区别 ...
随机推荐
- boost bind及function的简单实现
前面在做 http server 的时候,需要做一个回调的接口,要求能够绑定类的函数以及普通的函数到这个回调里,对于这种应用要求,选择 boost 的 bind 和 function 是最合适不过了, ...
- java实现点选汉字验证码
package com.rd.p2p.web; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; im ...
- eclipse代码提示javadoc背景为黑色框的解决办法
我的eclipse是近期下载的oxygen版本.不知道怎么出现了一个这个问题,鼠标悬停指向代码时应该出现的代码提示解释框,全为黑色,看不到文字.如下图 经过验证,最终解决方法为window->G ...
- Linux 操作系统文件略解
1.使用tree命令查看根目录的树结构 # tree -L 1 如果没有tree命令,可以使用yum进行安装 # yum -y install tree 执行命令后,即可看到根下一共有19个目录 . ...
- raspberry pi wifi
vim /etc/network/interfaces 修改 wpa-ssid 和 wpa-psk
- 【hyperscan】示例解读 pcapscan
示例位置: <hyperscan source>/examples/pcapscan.cc参考:http://01org.github.io/hyperscan/dev-reference ...
- Android众说纷纭分辨率
Andoid最被人诟病的就是显示屏的各种不同尺寸和不同分辨率.由于Android厂商的纷繁多样,导致出现了不同尺寸和不同分辨率的手机,指示开发者需要兼容各种手机屏幕.本文想学习的就是Android的显 ...
- CentOS7系统下YUM安装安装Mongodb 3.4
第一步 查看是否存在Mongodb配置yum源 切换到yum目录 cd /etc/yum.repos.d/ 查看文件 ls 第二部 不存在添加yum 源 创建文件 touch mongodb-3.4. ...
- CentOS 7 安装配置 Gitlab
centos:http://www.centos.org/download/ download:https://about.gitlab.com/downloads/ update:https://g ...
- 磁盘分区以及Linux目录挂载详解
一.背景 一直以来,对于磁盘的分区以及Linux目录挂载的概念都不是很清晰,现在趁着春暖花开周末在家没事就研究了下它们,现在来分享我的理解. 二.概念详解 1.磁盘分区 磁盘分区是把物理的磁盘空间按照 ...