RegionServer详解

作者: 和心数据 | 来源:发表于2016-12-30 08:53 被阅读3149次

    HRegionServer是HBase中最主要的组件,负责table数据的实际读写,管理Region。在分布式集群中,HRegionServer一般跟DataNode在同一个节点上,目的是实现数据的本地性,提高读写效率。

    0.94之后的HRegionServer:图片来自Map-R网站 0.94之前的HRegionServer HBase结构

    1 RegionServer中的组件

    1.1 WAL:Write Ahead Log

    1.1.1 主要特点

    • 为一个文件
    • 0.94之前叫做HLog,存储在/hbase/.logs/目录中
    • 0.94之后存储在HDFS上的/hbase/WALs/{HRegionServer_name}
    • 记录RegionServer上的所有编辑信息(Puts/Deletes操作,属于哪个Region),在写到memstore之前
    • 理论上一个RegionServer上只有一个WAL实例,数据操作为串行,造成性能瓶颈
    • 用于RegionServer失效时,通过Replay恢复RegionServer上memstore中尚未持久化的数据

    1.1.2 多WAL实例

    • HBase1.0 之后,通过使用底层HDFS的多管道实现了多WAL并行写入,提高了吞吐量
    • 并行化是通过对多个Region进行分区实现的,如果只有一个Region,那么该方案无效
    • 通过在hbase-site.xml中配置,然后重启RegionServer
    <property>   
      <name>hbase.wal.provider</name>   
      <value>multiwal</value> 
    </property>
    

    1.1.3 WAL Splitting :分组

    • 将WAL按照Region进行分组的过程称为WAL Splitting。这对于Region Server挂掉数据恢复来说是一个非常关键的过程。
    • 该操作是在集群启动时HMaster执行或者RS失效时执行的
    • 涉及到Region在此操作完成之前是不可用的
    • 流程请看文章后面

    1.1.4 WAL Replay :重播

    可查看 3.4 WAL Repaly 流程

    1.2 MemStore

    • 写缓存,数据先写到MemStore,flush触发后刷新到磁盘
    • 以KeyValue的形式存储在内存当中
    • 当MemStore flush触发时,属于同一Region的所有MemStore会刷新到磁盘中
    • 是Region中的重要组成部分,详细请查看Region详解

    1.3 BlockCache

    • 读缓存,数据被读取之后仍然缓存在内存中
    • 有LruBlockCache(效率较高,GC压力大)和BucketCache(效率较低,没有GC压力)两种BlockCache,默认为LruBlockCache
    • 每个RegionServer中只有一个BlockCache实例

    1.3.1 HBase 'Block'

    • HBase读写中的最小单元
    • 有四种类型的block:DATA、INDEX、BLOOM和META
      • DATA:存储用户数据
      • INDEX:用于提高读取速度,为DATA BLOCK中的cell建立索引
      • BLOOM:用于提高读取速度,用bloom filter过滤掉不包含需求数据的block
      • META:存储HFile本身数据和元数据

    详细信息请看 BlockCache资料

    1.4 Region

    • HBase表格根据row key 划分成“Regions”。
    • 一个Region包含该表格中从起始key到结束key之间的所有行。
    • Region由Store组成。
    • Regions会被分配到集群中称为“Region Servers”的节点

    详细信息请看Region详解

    2 RegionServer的主要功能

    • 定期向Master汇报RS的情况,包括RS内存使用状态、在线状态的Region等信息
    • 管理Region,执行Flush、Compaction、Open、Close、Load等操作
    • 管理WAL
    • 执行数据插入、更新和删除操作
    • Metrics:对外提供了衡量HBase内部服务状况的参数
    • 内置HttpServer,提供访问RS的界面

    3 RegionServer的主要流程

    3.1 首次读写流程

    • Client从ZooKeeper中读取hbase:meta表
    • Clinet从hbase:meta获取想要操作的Region的位置信息,缓存hbase:meta在Client中,用于后续的操作
    • Client向目标Region所在的RegionServer发送请求,执行操作
    • 当一个region因为Master执行负载均衡或者RegionServer挂掉而执行的重定位之后,Client需要重新读取hbase:meta进行缓存
    首次读写流程,图片来自Map-R网站

    3.2 写流程

    • Client提交一个Put请求到RegionServer,数据首先会写到WAL中
    • 当数据写到WAL之后,数据会写到MemStore中,等待刷新到磁盘中
    • 数据写到MemStore完成之后,RS会给Client发送确认信息
    写流程(一),图片来自Map-R 写流程(二),图片来自Map-R

    3.3 读流程

    1. 首先扫描BlockCache(读缓存)中寻找row cell,若没有则执行2
    2. 扫描MemStore(写缓存)中寻找row cell,若没有则执行3
    3. HBase会使用BlockCache索引和bloom filters来加载那包含目标row cells的HFile到内存
    读流程,图片来自Map-R

    3.4 WAL Splitting 流程

    1. /hbase/WALs/<host>,<port>,<startcode> 目录进行重命名
    • 改成:/hbase/WALs/<host>,<port>,<startcode>-splitting
    • 当RS被HMaster被认为失效的时候,它可能仍然在运行,所以为了保证已经存在的有效的数据
    1. 读取WAL中的Edits信息根据region将属于不同region的edits写到对应的/hbase/<table_name>/<region_id>/recovered.edits/.temp(临时文件),当splitting完成后,临时文件名称会修改为写入该文件的第一个log信息的序列号
    2. 在Splitting完成后,涉及到的Region会被分配新的RegionServer,那么在新的RegionServer打开Region时会检查recovered.edits目录下是否有edits文件,如果有则读取edits写入到MemStore中,写入完成后刷新到HFile中并删除edits文件。

    3.4 WAL Repaly 流程

    • WAL Replay流程依赖于WAL Splitting流程
    • WAL Replay流程实际上就是WAL Splitting流程中第三步
    • WAL Replay是在打开Region时完成的
    WAL Replay,图片来自Map-R

    参考资料

    BlockCache
    Apache HBase ™ Reference Guide
    An In-Depth Look at the HBase Architecture
    深入分析RegionServer

    若有侵权,请联系我

    相关文章

      网友评论

        本文标题:RegionServer详解

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