Hadoop ->> HBase

HBase是源于Google的Bigtable理念。它的特点是:稀疏,非结构化,列存储,多维度;

稀疏:把一些可能没有关系(从自然界实体的理解上)数据都存储到一张表这样的设计理念的结果就是某些列只在某些行上面有值。比如我们把原本应该在关系数据库中作为不同实体存在而把数据存放在不同的实体表中的“汽车”和“人”存放到一张表里面,那肯定会造成只有“人”在“年龄”字段有值。而对于“汽车”就会出现时空值(NULL)。那么从二维平面上看上去这张表就像土壤一样很稀松的。这就是稀疏的意思。而HBase存储的时候每一行都是可以存储不同的列。列名是“<family>:<label>”。这个family是一个每张表的列集合。改了表结构就改了这个集合,我理解就像是你在cnblogs上发表一篇随笔,在最底下的“标签”处输入新的标签今后就会被自动加入到“标签列表”是一个意思吧。

非结构化:非结构化是指没有具体的数据类型,都是是字符串,字段长度可变(不要求存储固定长度的数据)。但是每一行还是必须有一个用于排序的主键。主键可以是某一列或者列组合。

 列存储:这个就和SQL Server的column store index是一个概念。SQL Server下列存储索引的数据都是同一列的数据存储在同一个页面(page)上,可以理解成就是HBase把同一列的数据都放到同一个文件里面。可是这样文件的数量就会很多,所以其实HBase是把同属一个family集合的数据都放到一个文件(也有人说是目录?再了解清楚)里面。

多维度:这个不知道怎么理解。

数据历史版本保留:

数据行每次被更新都会产生一个新的版本,会有一个时间戳用来记录该记录被最后被更新的时间。而HBase每次会保留一定数量的数据版本,这个值是可以被设置得。

锁:

HBase和关系型数据库一样也有锁的概念。每一行都是一个原子元素,在数据行被更新的时候被锁定。

HBase架构有三种角色关系:HBaseMaster,HRegionServer,HBaseClient

HBaseMaster:这个顾名思义就像HDFS的NameNode。它负责管理所有的HRegionServer以及监控他们的运行情况,还有集群中域的分配,以及表的管理维护。而因为一个HBase系统只有一台HBaseMaster服务器,所以需要zookeeper来确保一旦主服务器宕机,可以立刻通过领导选举算法选出一台新的HBaseMaster服务器并初始化根域目录。首先聊聊这个“领导选举算法”,这个听着有点像Windows下面的NetBIOS的选举方法,就是在当前工作组里面选出一台机器出来充当管理工作组内的机器管理的角色。其次根域目录听着也像Windows的Active Directory的那种组织结构的管理概念。HBaseMaster在初始化的时候都需要先从HTFS系统获取当前的根域目录信息,失败的话就是自动创建新的根域目录,以及第一个元域目录(这个不知道什么东西,还没了解到)。

HRegionServer:它的职责则就像对应着HDFS下的DataNode了。HBaseMaster分配了一个域给它,那它肯定就是负责管理它负责的域和数据,处理客户端的读写请求,本地缓冲区的回写(我理解就相当于SQL Server下CheckPoint时的Flush,即将内存缓冲区里的数据写入到磁盘),数据压缩还有分割域(我理解应该就是把原本一个域分割成两个域)。每个域只能有一台域服务器来服务,但是一台域服务器可以服务多个域。HRegionServer会读取HDFS读取域的日志和数据文件。

HBaseClient:充当请求写入和读取数据的角色。HBaseClient先和HBaseMaster通信获取根域服务器地址,然后去根域服务器扫描它的metadata或者它要找的HRegionServer的地址。然后HBaseClient连接到HRegionServer请求写入或者读取数据。这个过程其实和HDFS的数据访问和写入流程很相似嘛。只是这里NameNode换成了HBaseMaster,而DataNode换成了HRegionServer,而Client就是Client了。HBaseClient的工作流程,再获取了HRegionServer的地址之后,地址会被缓存起来。

这张图展示了HBase和HDFS的关系

那回过头来结合HDFS来思考,HBase本来就是在HDFS上面的一层应用,两者都是这种管理者+节点的架构。他们的运作关系是否是这样?

HDFS是一个文件系统,就像Windows下的NTFS,而HBase是一个数据库,就像SQL Server。或者可以这么讲,两者都是系统,HBase建立在HDFS上面。

HDFS下层是单机操作系统的文件系统,像在Linux上可能就是ext3,这层的存储单位是文件;

再上一层是HDFS。它的数据管理单位是文件块,文件块是在数据节点服务器上。文件块和下层的操作系统的文件系统的文件有一层映射关系。数据节点是不是和服务器是一对一的关系呢?我理解是一台服务器可以有多个数据节点。

而HBase的数据管理单位是表,表再上一层是域管理单元,域是属于域服务器的。那问题就来了,HDFS和HBase不同管理单元间的关系是怎样的呢?回想下前面说到的,每个表内的同一family集合的数据列的数据属于同一文件目录,那也就是文件块是和表的列的family集合有关。

原文地址:https://www.cnblogs.com/jenrrychen/p/4983745.html