HBase的读写流程

HBase中最基本的原理就是rowkey,进行增删改查的话,首先要找到rowkey所存在的Regoin,Regoin在RegoinServer中,一般Regoin都是RegoinServer区间的一个定义,这是它最基本最狭义的一个描述,但是这里面要知道相关的元数据信息比如说写流程,

写流程:

客户端先去zookeeper,zookeeper中有一个节点,类似于root表的一个概念,它存储的是mate表元数据表,元数据表也是HBASE表,它的表Regoin在RegoinServer中,Regoin是什么样子呢?首先对于rowKey,比如说table1,后面加上1-100那么这个rowkey就是由表名和Regoin的区间所构成的rowkey,还有table+100到200区间构成了新的rowkey,一种rowkey设计,Regoin已经代表了你已经使用的表和输入插入和写入的一个范围的关系,通过zookeeper能够找到你所对应的 你要操作的哪张表,那些rowkey,映射完Regoin,以及Regoin在那些RegoinServer上,这是元数据,当可客户端做完一次读操作后,会做一个客户端缓存,缓存到客户端自己的内存里面,然后去访问RegoinServer,通过RegoinServer拿到Regoin,因为他是一个范围,Regoin中存在的是如果一张表中有很多信息,在加上其他表那么这些表是有序的,以及之后一部分截取出来算作你的一个Regoin,这个Regoin的信息会存在RegoinServer里面,客户端就会找到这个Regoin块,这个Regoin块里面存了不同的表,会扫描这张表和rowkey,会查找某条记录,这条记录里面会有你目标访问的表以及包含这个Regoin在哪个RegoinServer里面,找到之后客户端会再次和目标表的那个RegoinServer,进行连接,然后把你的数据先写到你的内存里面,写的时候会做一次写日志,并不是向磁盘落写文件。当日志写完之后,内存中的数据当达到一定的大小之后,会进行溢写,这里面要强调一点,HBase是偏内存进行使用的,当你积攒了一段时间之后,其实在内存那里面缓存的这些数据,它相同rowKey的不同时间戳的数据就会排在一起了,会有一个缓冲、梳理过程,那么这样的一批数据如果写到一个文件的时候那么这个时候会面向每一个文件做列式存储,就是他是面向rowkey,里面如果有几百个时间戳、有不同的版本线的话,它垂直吧每个列切出来,然后把这些列顺序摆好,那么就是所说的列式存储,所以就知道了那个区间到哪个区间是第一列的,那个区间是第二列的,如果你只希望要的是某些列的某一列的话,那么只需要在这些线性文件中,通过区间调到那个区间内在加上时间戳,这里面如果加上索引的话,可以理解一下bitmap,就是这种位图的概念,如果一家公司有上千人,如果你想记住这1000人每一天的登录情况的话,会怎么做呢?每个只需要325个而二进制位,它在哪天登录哪天标1就可以了,转过来说HBase的每一个单元格可以为空,应为他是列式存储,rowkey下面的某个列没有值,则不会再磁盘中开辟这个空间, 这时候去想,如果把一个表中那些表格,在磁盘中将那些空的位置挖掉,挖掉的地方就轰塌了,那么数据就会连一起,但是有了二进制位的记录,那个原始位置我们是可以知道的,比如说AA B  可以标记为1101但是存储的时候是AAB,中间空格没有了,所以说在读取地四个B的时候,怎么办呢?先找对应的二进制位,那么根据二进制位,就可以找到对应的数据了。当然很多方式都是实现这种列式存储的方式的,所有的方式的成功,都是来源于内存的缓存,内存的缓存既提高了用户查速度,另外就是因为在内存中赞了一段时间了,他就会吧这一个rowKey的,若干条时间线的数据组在一起,然后把每一列切出来,再加上索引,然后把空值去掉,存在一个物理层中,列式存储才能实施起来。这是第一点。

第二个点就是,如果抛开HDFS,如果是本地文件系统,如果向内存下写时候,在单机环境下,无论是什么分布式计算的话,拼的就是最后的单机的优化,单机的优化特别高的性能...,那么整个分布式的性能也是高性能的,还有个就是溢写,在单机当中写数据分为顺序读写和随机读写,随机读写是你磁盘最慢的一种方式,比如说,如果准备一对琐碎的小文件,都是1,2K啊,很多零碎的小文件,开始随机读写到时候,一旦进行随机读写时候,那么他的速度会降到K级别,两个差异是很大的。所以说呢HBase内存满了之后,它不是把那个数据修改之前的那个文件,随机地往磁盘放,而是它触发的磁盘最高性能的顺序读写,而且这个顺序文件保证的一个特性就是它的rowkey版本不同的,之前的文件不会被覆盖不会被修改,你要更新版本的话,只需要扫描一下文件的版本号就可以了,在加上每个rowkey都有二进制位的索引,起始列式存储这种方式是很快的,还有一点就是,这种具有单机性能优势的还有kafka,Elsearch,他们优势利用了磁盘的顺序读写,在kafka中,在es当中,那个文件叫做sequenceFile,一段,数据时一段一段地忘磁盘上写。这就是HBase的写流程。

读流程:

Client进行读数据的时候,首先还是找zookeeper,找元数据表的入口点,最终找到元数据表,要找你要找的数据的Regoin,在哪个RegoinServer里面,吧Regoin读过之后,然后真正地去找目标表的RegoinServer,因为所有的活动都是和RegoinServer有关的,RegoinServer是一个进程,Regoin是虚拟的,RegoinServer和cli连接之后,然后客户端将请求给到RegoinServer,RegoinServer会冲一堆Regoin当中找到所需要的Regoin内存空间,先是从写换缓存当中去读数据,如果写缓存中没有的话就去读缓存中去找,读缓存中没有的话就去磁盘中去找,取完了之后就放在读缓存中去做缓存,方便后续的操作更快一点。

 

HDFS和HBase相同的点:他们都叫做二进制安全,什么是二进制安全呢?他们是以客户端发来的字节数组的形式存东西的,客户端发来的都不同做任何编码和解析,无论是redis还是HBase也好,都是客户端发起一个字节数组,只会存字节数组。这有一个差异,同样都是存字节数组,redis有一个优势,比如说修改里面的某一个数字给他加一,在关系型数据库中首先要查询这个数,在redis有一个原语的调用,incrby将key中的数字增减,这时候可以得出一个结论,redis就像大数据的思维,计算向数据移动,像关系型数据库和HBase,都是吧数据移动到客户端,客户端加一再存回去,这时候必然有事务和锁等相关的,redis查询快,所有人的请求,由于计算向数据移动,所有操作都进行加,加完之后推向redis这个单进程,所以数据加完之后也是正确的,计算不是发生在客户端。