Hbase

作者: 神呐_宽恕我把 | 来源:发表于2019-12-13 14:57 被阅读0次

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

相关文章

网友评论

      本文标题:Hbase

      本文链接:https://www.haomeiwen.com/subject/oiefnctx.html