HBase内的基本概念
- 上一篇文章,引出的有点简单哈哈,但是其他的概念是很重要的,还是需要理解记忆的,那么这篇将了解HBase的内部结构,有了这个知识才能够进行后续的编程和学习
HBase简介
- 首先说一下Hadoop,Hadoop是也是根据谷歌发表的论文的原理进行实现和改进的,Hadoop是一个分布式的,并提供了高可用,文件备份等一些特性,他可以运行在普通的硬件的,也提供的超大文件的存储和备份机制,而且有超强的扩展性和吞吐量
- HBase是基于Hadoop的,所以上面说的所有点HBase也具备,HBase采用的是Key/Value的存储方式,所以他就不会因为数据量大,而导致查询性能的下降,并且HBase是一个列式存储的,当表的字段很多的时候,甚至可以将这些字段放在不同的机器上,来分散负载的压力,这样就导致了时间的增加:网络传输的延迟以及需要组织展示数据的耗费的时间等,所以它存储少量数据也不会很快,只是当数据量大的时候它慢的不明显
- HBase数据分析是弱项,所以总的来说,当表的数据很大,并且并发挺高,分析需求较弱的时候,就可以考虑HBase了
部署架构
- 对于HBase的集群的搭建,网上有很多的例子,我自己搭建的是5台HBase高可用,我会将我的配置文件传上来供大家参考
- 在搭建集群的时候,我们需要去了解HBase各个部分是做什么的,否则一上来就找文章进行搭建,完全就是按着人家的做,而根本不知道自己在做什么
- HBase的部署结构主要分为Master服务器和RegionServer服务器,Master也可以配置HA,即一个活动节点,一个备用节点,当活动节点挂掉,备用节点就会顶上来(局长被暗算,副局长要顶上局长位置),Master负责维护表结构信息,而RegionServer用来存储数据,存储的数据直接放在Hadoop的HDFS上
- 提一下Zookeeper,在HBase中它起到了相当重要的作用,Zookeeper是做什么的呢?他就好像是几个老师(Zookeeper集群),当班级成立的时候,要一起讨论选出一名班长(选举活动节点),当有一天班长做错事不受同学喜欢了(活动节点宕机之类错误),那么为了领导班级,这几个老师将就会再次选出一名新班长来领导班级,所以Zookeeper的作用就是在n个服务器中选出活动节点,在活动节点挂掉的时候,选出另一个节点顶替活动节点,Zookeeper的职责就是选举,保证集群的高可用
- 说完Zookeeper,那么它与HBase是什么关系呢?我们将由HBase的一个特殊点来引出:当你想从HBase获取数据的时候,客户端是直连RegionServer的,你会发现Master节点挂掉后,你依旧可以返回需要的数据,但是不能新建表了
- Master不是类似Hadoop的NameNode提供存储服务器地址的吗?不是的,而是Zookeeper管理着HBase所有的RegionServer的信息,包括具体的数据段存放在哪个RegionServer上都是Zookeeper来管,你每次与HBase连接,其实都是与Zookeeper通信,查询出那个RegionServer需要连接(你需要的数据在哪个服务器上),然后再连接它,所以我们就知道了Zookeeper对于HBase是多么重要了
- 上面就是HBase的整体的架构,自己画的,可能会画的不完整,因为client不可能只和Zookeeper交互,但是目前我就知道这么多,下面将介绍一下各个部分是做什么的
- Master:它只是打杂的,并不是类似Namenode老大哥,因为之前说的,client从Zookeeper获取RegionServer地址后,会直接从RegionServer获取数据,其实不光是获取数据,包括插入,删除所有的数据操作都是直接操作RegionServer,而不需要经过Master,Master还是有工作的比如建表删表等,为什么是这样呢,因为表在数据库中是唯一的,他是跨RegionServer的,所以HBase就将这些信息存放在Master上了,这种结构的好处是大大降低了集群对Master的依赖,如果没有配置HA而且Master挂了,集群依旧可以正常的增删改查数据,但是对数据库的结构就不能操作了
- RegionServer:就是存放Region的容器,当客户端从ZooKeeper获取RegionServer的地址后,它会直接从 RegionServer获取数
-
Region:HBase中的表一般拥有一个到多个 Region,也就是将表切分成多个Region,所以Region就是表的一段数据的集合
- Region不能跨服务器,即只能在本服务器内读取本服务器内的Region上的数据
- 当一个Region特别大的时候,HBase会再次拆分这个Region
- Region是基于HDFS的,它的所有数据存取操作都是调用了HDFS的 客户端接口来实现
- RegionServer可以将Region移动到另一台RegionServer上
- 我们简单的介绍了HBase的组成,下面将介绍一下HBase的存储架构
存储架构
- 我们前一篇文章已经将行式存储和列式存储简单的介绍了一下,既然HBase对于RDBMS来说是一种列式存储的数据库,那么HBase的最基本的存储单位就是列了column,一个列或者多个列形成一行row,HBase中每一行的数据的列可以不同,这个行的数据跟另外一行的数据也可以存储在不同的机器上,甚至同行内的列也可以存储在不同机器上
- 每一行都有一个行键row key来唯一标定一行,每个列都有多个版本,多个版本存储在单元格cell中,若干列还可以被分为一个列族column family
- 如上cell就是多个column版本的集合
行键
-
完全是自己定义的,系统按照rowkey排序,所以rowkey也就决定了这行数据在表中的存储存储顺序,并且他的排序是这样的,按照二进制逐字节从左到右依次对比每个行键
row1 row2 row12 排序后 row1 row11 row2
- 如果后面插入的rowkey与存在的rowkey重复了,那么本次插入的数据就会将原来的值给更新掉,之前的值会被放入历史记录并不会丢掉,只要带上时间版本就可以找到它,在一行一列中的若干个版本的数据就构成了cell
- 行键可以是任意的字节数组
列族
- 若干列可以被类分为一个列族
- 在创建表的时候是不需要指定表中的列的,但是必须指定列族,列的添加删除是相当灵活的,而列族定义好了后就不建议有大的变动,表中的很多属性也是建立在列族上的,这样当一个列族具有某个属性后,那么他范围内的列将具有相同的属性,列必须依赖列族存在,所以在建表的时候必须指定列族
- 列族存在的意义是:HBase会把相同列族的列尽量放在同一台机器 上,所以,如果想让某几个列被放到一起,你就给他们定义相同的列 族。
- 因为列是依据列族的,所以在我们查找指定的列的时候,就必须指定列族,比如columnfamily:column这样的形式
单元格
- 之前说了若干个版本的数据就构成了cell,所以只是查找到columnfamily:column,是无法确定一个值的,还需要的是cell的时间戳,也就是columnfamily:column:timestamp,所以这样才能够确定一个列,加上行键信息,完整的确定一个值的应该这样
rowkey:columnfamily:column:timestamp
- 版本号由系统默认给定当前时间戳,也可以自己指定
Region跟行的关系
- 一个Region就是多个行的集合,在 Region中行的排序按照行键(rowkey)字典排序
- 对于搭建集群用到的配置文件,我配置的时候也是一切从简,希望能够帮到大家,可以从附件直接下载
- 或者网盘下载:hbase-conf

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
【Elasticsearch 5.6.12 源码】——【1】源代码调试环境搭建
版权声明:本文为博主原创,转载请注明出处! 简介 本文主要解决以下问题: 1、从何处以及如何下载Elasticsearch 5.6.12的源代码?2、如何将源代码导入到IntelliJ IDEA中进行编辑?3、如何在IDEA中运行并调试Elasticsearch的源代码? 软件环境 本文写作时在Windows 7系统上搭建了源代码调试环境,工作中使用相同的步骤在Fedora 24上搭建了开发环境。本文使用的软件环境如下: JDK 1.8.0_144 Gradle 4.8.1 IntelliJ IDEA 2017.2.7 源码下载 从elastic官方的GitHub仓库中去下载Elasticsearch 的源代码。你可以使用git clone的方式下载,也可以GitHub的下载链接单独下载ZIP文件。本文采用第二种方式,如下图所示: 导入IDEA Elasticsearch 5.X 使用Gradle包装器进行构建,在将源码导入IDEA前可以使用gradlew执行源码中提供的脚本自动生成IDEA需要的配置文件。 1、构建源码 将下载完的源码文件解压,在源码文件的根目录执行如下命令: gra...
- 下一篇
HBase基本操作-shell使用
这篇在学习之前,需要搭建好HBase集群,当你的集群搭建好了,那么就开始学习HBase的shell操作把~ 这篇文章将只会介绍使用频率最高的shell命令,这些没有什么难度,只是一些熟练问题,我的HBase版本是2.1.1 进入HBase的命令行的命令是HBase shell 查看HBase shell中命令帮助的命令是help 'xxx' create建表 前一篇文章说过了,建表必须指定列族这件事是不能忘的,比如创建一个名为test的表,表中有一个列族名为cf hbase(main):029:0> create 'test','cf' Created table test Took 1.2710 seconds => Hbase::Table - test 所以也证实了之前说的必须有列族的指定,如果不加会报错的,列是依附于列族上的 以上创建方式只是指定了列族而没有指定列族内的列,为什么不用指定列呢? HBase不像RDBMS一样在建表的时候就必须指定列,因为RDBMS的数据需要有地方放,如果RDBMS不指定列,那么他一个表还有什么?他的数据往哪里放?但是在HBASE中列是...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS6,CentOS7官方镜像安装Oracle11G
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2全家桶,快速入门学习开发网站教程
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- MySQL8.0.19开启GTID主从同步CentOS8
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池