Hbase的架构:主从的架构方案
逻辑架构:
region:逻辑的划分,一个region对hbase表的行级的划分操作(水平划分)
默认情况下,在创建一个表的时候,默认的region个数只有一个
一个region只能属于一个regionserver,region是划分的最小的单位,多个region,每一个region都可以分布在不同的regionserver上
store:逻辑的划分,在region中,对每一个列族进行划分,一个列族对应着一个store模块,如果有列族,就会产生多个store的模块
注意:在创建表的时候,不建议列族建立过多,列族多了,store模块变多,在数据读写操作的时候,需要操作不同store模块,增加IO操作,读写的效率下降
物理架构:
HLog:WAL(Write-Ahead Logging)预写日志,当写入数据的时候,会先写入HLog中,一个regionserver就会管理一个HLog日志
在HLog中必然会表数据都写入到一个HLog中
目的:实现数据恢复工作(memstore数据)
如果表很多,每个表中数据也有很多,可能存在内存中数据也会很多,对应的HLog数据也会很多,当机器出现宕机后,在恢复的时候,恢复的过程也会变得很漫长的(整个过程是可以忍受的了的)
HLog可以支持关闭,提升写入数据的效率,安全措施会降低,一旦宕机,内存数据将无法恢复
HLog:
1.在进行写入的时候,会将数据写入HLog中,追加方式写入HLog(HLog文件一般放置/Hbase/WALS),每隔一个小时会生成一个新的HLog的文件,将新的数据写入新的HLog文件(防止HLog文件过大) ---HLog滚动机制
2.当内存中数据写满后,flush到磁盘上,HLog中存储这一份内存数据,认为已经过期了 ---HLog的日志数据过期
3.当过期数据移植到oldWALs目录下:---移植到过期wals的目录下,等待删除
4.设置过期时间:默认10分钟 --- >系统每隔一分钟访问一次oldWals目录,判断这些数据所在的内存数据是否完整写入磁盘,如果正常完整的写入成功,直接删除即可
memstore内存的空间:默认是128M
在写入数据的时候,除了将数据写入HLog中,也会在memstore中写入一份
当内存空间写满后,将这个内存空间关闭,将这个内存的数据放置到一个队列中,然后开启一个新的memstore,开启一个子线程,由子线程去读取队列中数据,将这个数据flush到磁盘上(一个内存数据,只会产生一个storeFile文件),由于数据在内存中已经排好序的写入磁盘上storeFile文件都是排序好的
注意:正常使用memstore只能有一个
hfile格式文件:是Hbase自己定义的一种存储格式,类似于在hdfs中ORC,textFile。。。
为什么hbase不使用hdfs提供文件格式。非要自己定义?效率
hfile除了放置数据以外,放置数据对应的索引值,查询和读取操作都要索引找到对应的数据
Hbase的写入流程:
1. hbase的客户端首先连接zookeeper,到zookeeper查询hbase:meta表所在的regionserver的位置
2. 连接meta表所在的regionserver的服务器,从meta表中获取添加数据所在表的region的所在的regionserver的位置
3. 从meta表获取当前数据regionserver的地址,连接对应regionserver,开始进行写入数据
4. 连接成功后,首先将数据写入对应regionserver的Hlog的日志中,然后将数据写入到metastore中
当这两个地方都写入成功后,客户端认为当前数据写入成功了,此时客户端任务结束
5. 当memstore内存空间写满(128M)后,启动flush机制:
a. 关闭写满空间,开启一个新的metastore
b. 将写满内存数据放置到队列中
c. 由执行flush刷新的线程将数据从队列中读取出来,写入hdfs上面形成一个storeFile文件(128M)
.6. 当storeFile文件个数达到阈值(默认3个)后,启动compact机制,对文件进行合并操作:
目的:将多个storeFile文件最终合并成一个大HFile文件
功能:对文件进行排序,删除被打了标识的数据,更改修改数据操作
7. 当这个大HFile文件达到一定阈值(10Gb)后,启动split机制:
将这个大的HFile文件进行等分 一分为二的操作:
获取这个region的startkey和endkey,获取中间rowkey形成两个HFile文件,每一个HFile对应一个region
compact合并操作:主要两个合并过程:
minor(辅修):将相邻各个小的storeFile先进行合并操作,将合并成为一个文件,不会对数据进行删除更改操作
majar(主修):将minor合并的文件和之前的大的Hfile文件进行再次合并操作
这是一次完整的合并操作:此操作会占用大量的资源,时间较长
找到需要被删除的数据或者需要被修改的数据,在这里执行操作
采样追加的方式形成最终大文件的
hdfs随机的修改:合并操作,只能将数据完整的读取出来,然后通过代码聚合后,写入hdfs中
数据在修改或者删除的时候,都是在memstore中处理的:对数据打标识查找
不会真正的将数据给修改或者删除的,只是标识标记操作
因为数据可能已经存在hdfs中,无法直接将这个数据给删除或者修改的,只能在compact的时候进行处理,此时做法记录的标记即可
总结:
一个表的region越多,描述的表中数据越多(默认情况下)
因为:一个region只能被一个regionserver所管理的
当有大量的请求往这个表中写入数据的时候,由于只有一个region,这些请求必然会打到一个regionserver,hbase的高并发并不是指的一台机器支持高并发,而是多台机子共同实现高并发,当大量的请求全部发到一个regionserver上,导致regionserver宕机,如何解决?
解决方案:
a.能否一个region让多个regionserver所管理(实现不了)
b.能否在创建表的时候,手动指定多个region呢(hbase的表的预分区的操作)
核心:
如何预分区
如何设置rowkey
网友评论