- 上一篇文章,引出的有点简单哈哈,但是其他的概念是很重要的,还是需要理解记忆的,那么这篇将了解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