HBase 架构

  1. 数据的查找及传输
    1. HBase 和RDBMS的底层存储结构的不同
      RDBMS 的底层存储结构大多为B+树结构,这种结构可以通过主键对数据进行高效的查找、插入和删除操作,并且支持范围扫描(叶子节点之间相连并且主键有序)。
      HBase 的底层存储使用的是LSM树结构,这种结构的写操作(插入/修改/删除)都是在内存中进行的,并且会创建一个新纪录(修改会记录新的数据值,删除会记录一个删除标识) ,这些数据在内存中仍是一个排序树,当数据量超过设定的内存阈值后,就会将这颗排序树和磁盘上最新的排序树合并一棵树,当磁盘上的这棵树的数据量也超过了设定的阈值,就和磁盘上下一级的排序树合并,合并过程中,会用最新的数据覆盖旧的数据或是记录为不同的版本。

      LSM树在数据读取时,总是先从内存中的排序树开始查找,如果没有找到,就会从磁盘上的排序树顺序查找。
      在LSM树上进行一次数据更新不需要磁盘访问,在内存中即可完成,速度要远快于B+树。当访问以写操作为主,而读操作则集中在最近写入的数据上时,使用LSM树可以极大的减少磁盘访问次数,加快访问速度。

      LSM树和B+树相比,LSM牺牲了部分读性能,来大幅提高写性能。因为LSM的读取是先从内存中查找,如果没找到,就会到磁盘上查找。
  2. 存储
    1. 下图展示了HBase如何Hadoop文件系统协作完成数据存储的

      从图中可以看出HBase主要处理两种文件:一种是预写日志(Write-Ahead Log, WAL),另一种为实际的数据文件。这两种文件主要由HRegionServer管理。
      一个基本的流程是客户端通过Zookeeper获取含有-ROOT-的region服务器名(主机名),然后通过含有-ROOT-的region服务器查询其.META.表中与行键对应的region服务器名,该region服务器就是行键数据所在的地方。一旦知道了数据的实际位置,即region的位置,HBase会缓存这次查询信息,并和管理实际数据的HRegionServer交互。

    2. 写路径
      当客户端put数据时,region服务器通常会将数据写到预写日志(WAL)中,数据写到日志后,然后便会备放到memstore中,同时还要检查memstore是否已经满了,如果满了,memstore中的数据便会被刷写到磁盘上,数据会被写成HDFS中的一个新HFile文件。同时也会保存一个序号,系统便知道哪些数据现在已经被持久化了。
    3. 文件
      HBase使用一个HDFS中可配置的根目录,默认为“/hbase”.
      HBase中的文件可以分为两类,一类位于HBase根目录下,另一类位于根目录中的表目录下。
      1. 根级文件
        WAL文件,位于根目录下的.logs目录中,该目录中有多个HLog文件,一个region服务器的所有region共享同一组HLog文件。
        当所有包含的修改都被持久化到存储文件中,不再需要日志文件时,它们会被放到HBase目录下的.oldlogs目录中
      2. 表级文件
        在HBase中,每一个表在HBase的根目录下都有自己的目录,每个表目录包含一个.tableinfo的顶层文件,该文件包含了表的元数据信息,如表和列族的定义等。
      3. region级文件
        在每张表的目录里,表模式中每个列族都有一个单独的目录,目录名字的一部分为region名字的MD5散列值。
      4. region 拆分
        当一个region里的存储文件达到指定的阈值时,就会被拆分为两个相等region,每个region都是原region的一半。拆分的过程是通常是很快的,因为系统只是为新region创建两个对应的文件。region服务器通过在父region中创建splits目录来完成这个过程的。接下来关闭原region,不再接受任何请求。
        然后region服务器在splits目录中创建创建相关的文件结构来准备新的region,包括新region目录和参考文件。如果这个过程成功完成,它将把两个新region移动到表目录中。同时更新.META.表中父region的状态,以表示其现在拆分的节点和子节点是什么。
        最终父region会被清理掉,这也意味着它在.META.表中的信息被清掉了,并且它在磁盘上的所有文件都会被删除。
      5. region 合并
        随着memstore刷写生成的磁盘文件越来越多,当这些文件的数量达到一定大小,就会发生合并,把这些文件合并成较大的文件。
        合并分为两种:minor和major。minor合并是指只重写最后生成的几个文件到一个大文件中。major合并是指把所有文件压缩成一个单独的文件。
  3. Write-Ahead Log
    region服务器将数据保存到内存中,直到累积到足够多的数据再将其刷写到磁盘上,这样可以避免产生较多的小文件,但保存在内存中的数据是不稳定的,如果发生断电,内存中的数据将会丢失,HBase采用的方式每次更改都会被先写到日志中,然后在写入到内存。这样即使突遇断电,还可以通过回放日志恢复到断电之前的状态。这也意味着如果某个操作写入日志失败,那么整个操作也是失败的。
    下图展示了WAL是怎样和HBase架构结合的

    从图中可以看出,WAL是被多个region实例共享的。
    大致流程是客户端向region服务器发送put或delete操作请求,到达region服务器端后,会被分配给与行相关的HRegion实例处理,首先会被写到WAL中,然后再写入到memstore中。整个过程看起来就是HBase的写路径。

    为什么是多个region共享一个日志,而不是一个region一个日志文件?
    因为一个region一个日志文件,就需要向HDFS并发写入多个文件,这样会造成大量的磁盘寻道来向不同的物理日志文件中写数据,降低性能。
    1. HLog类
      在同一个region server上,多个region共享同一个HLog实例。每个region都包含不同的行健范围,对行健的操作都会按顺序写入到WAL中。
    2. HLogKey类
      WAL当前使用的是Hadoop的SequenceFile,这种文件格式是按键值对的形式存储数据的。
      由于KeyValue类仅包含行健、列族、列限定符、时间戳、类型和值,所以需要一个地方来保存KeyValue的归属,即region和表名,这个信息就存储在HLogKey中。
    3. WALEdit类
      WALEdit类包含了一组客户端发送的修改操作,并且能够保证这一组操作的原子性,即这一组修改都会在一次操作写入。
    4. LogSyncer类
      客户端发送的每一个更改操作到达服务器端时,LogSyncer类都会调用写日志的sync()方法,将写入日志的更新写到磁盘上,来保证持久性。但是调用sync()方法会涉及到一对N的管道写(N为WAL文件的复制因子)。这是一个高代价的操作,可以让它延迟执行,并在后台运行,但这样做会有一定的风险,如果服务器出现故障,可能会造成数据丢失。
    5. LogRoller类
      HBase日志的大小是有限制的,当达到设定的阈值或着在特定的时间间隔内就会滚动日志,即关闭旧的日志,使用新的日志。HLogRoller类就是以一个后台线程来实现日志滚动的。过一段时间后,日志文件会越来越多,LogRoller类在滚动日志时,会调用HLog.cleanOldLogs()方法来检查写入到存储文件中的最大序列号是多少,这是因为小于或等于这个序列号的所有修改都已经保存了。然后还会检查是不是有日志文件的序列号小于这个数字,如果有,就会将这些文件移动到.oldlogs文件夹中,留下其余的日志。
    6. 回放
      详见http://blog.csdn.net/qiruiduni/article/details/50434373
  4. 读路径
    当在shell上使用get命令来获取某一行数据时,系统是怎么知道该返回什么呢?
    在读取所有存储文件来查找匹配的条目之前,会有一个快速排查的阶段:使用时间戳和可选的布隆过滤器(Bloom Filter)来排除那些绝对不包含所需条目的文件。然后再扫描剩下的文件和memstore来查找匹配的键。

  5. region查找
    HBase提供了两个目录表:-ROOT-表和.META.表,用来查找region。-ROOT-表用来查询.META.表中的region的位置。HBase中只有一个root region,并且是不能拆分的,从而保证类似于B+树的三层结构:第一层ZooKeeper中包含root region位置信息的节点,第二层是从-ROOT-表中查找对应meta region的位置,第三层是从.META.表中查找用户表对应的region的位置。

  6. region生命周期
    region的状态是受master控制的。
  7. ZooKeeper
    HBase使用ZooKeeper作为其协同服务组件,用来跟踪region服务器的状态、保证集群中只有一个Master、保存root region的地址等。
  8. 复制
    HBase的复制有些类似于MySQL的statement-based复制,它主要是通过WALEdit和HLog来实现的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值