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 数据库和单实例数据库的区别 ...
随机推荐
- AJPFX平台:中国的经济是个大泡沫吗?这个泡沫即将崩解吗?
AJPFX问:中国的经济是个大泡沫吗?这个泡沫即将崩解吗? 这一老问题,最近又一次引起世界的关注. 首先,中国在领导层变更之际,把2013年的增长目标定为7.5%,“保八”的调子不再,两位数高增长的时 ...
- “全栈2019”Java多线程第三十一章:中断正在等待显式锁的线程
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- Linux Shell脚本编程提高(12)
实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核,不仅如此,Shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序.Shel编程语言具有普通编程 ...
- Ubuntu 16.04下安装golang
手动安装 下载golang安装包 https://studygolang.com/dl 从上面的网站上下载适合自己机器的go版本,我这里选择的是go1.10.linux-386.tar.gz 解压安装 ...
- 转---单页面应用下的JS内存管理
正文从这开始- 内存问题对于后端童鞋而言可能是家常便饭,特别是C++童鞋.我在实习时做过半年的c++游戏客户端开发(也是前端开发哦),也见识了各式各样的内存问题,就说说我的第一个坑,当时做个需求,就是 ...
- [原创]K8 Struts2 Exp 20170310 S2-045(Struts2综合漏洞利用工具)
工具: K8 Struts2 Exploit组织: K8搞基大队[K8team]作者: K8拉登哥哥博客: http://qqhack8.blog.163.com发布: 2014/7/31 10:24 ...
- 传染病传播模型(SIS)Matlab代码
function spreadingability=sir(A,beta,mu) for i=1:length(A) for N=1:50%随机次数 InitialState=zeros(length ...
- MVC3学习:利用jquery+ajax生成二维码(支持中文)
二维码越来越热火了,做电子商务网站,不做二维码,你就OUT了. 一.下载DLL文件(ThoughtWorks.QRCode.dll),并在项目中引用.点此下载 如果你还不知道什么是QRCode二维码, ...
- Spark集群测试
1. Spark Shell测试 Spark Shell是一个特别适合快速开发Spark原型程序的工具,可以帮助我们熟悉Scala语言.即使你对Scala不熟悉,仍然可以使用这一工具.Spark Sh ...
- War文件部署
其实,开始要求将源码压缩成War文件时,一头雾水! 公司项目要求做CAS SSO单点登录 也就是这玩意.... 其实war文件就是Java中web应用程序的打包.借用一个老兄的话,“当你一个web应用 ...