深入浅出 HBase 实战 | 青训营笔记

100 阅读5分钟

深入浅出 HBase 实战 | 青训营笔记

这是我参与「第四届青训营 」笔记创作活动的的第8天

使用场景

开源的NoSQL分布式数据库,对稀疏表提供了更高的存储空间使用率和读写效率。CP系统。 存储层基于HDFS存储 计算层提供水平扩展、负载均衡、故障恢复

半结构化,无数据类型,以列族进行存储、支持TB、PB级数据

HBase数据类型

以列族组织数据,以行键索引数据。

  • 列族需要在使用前预先创建,列名不需要预先声明,因此支持半结构化数据模型
  • 支持保留多个版本的数据,(行键+列族+列名+版本号)定位一个具体的值

行键(rowkey):唯一索引一行的主键,字典序组织,一行可包含多个列族 列族(column family):一系列的列名,一个列族可以包含任意多个列名,每个列族数据物理上相互独立的存储,支持按列读取部分数据 列名(column name):定义一个具体的列,一个列名可以包含多个版本的数据,不需要预先定义列名 版本号(version):用于标识一个列内多个不同版本的数据,每个版本号对应一个值 值(value):存储的一个具体的值

主要数据结构

  • HDFS目录结构
  • MemStore:使用跳表(Skiplist)组织KeyValue数据,提供O(logN)的查询/插入/删除,支持双向遍历
  • HFile:
    • Scanned block section:顺序扫描HFile时所有的数据块将会被读取
    • Non-scanned block section:扫描的过程中不会被读取
    • load-on-open-section:region server启动时,需要加载到内存当中
    • Trailer:记录HFile基本信息,各个部分的偏移值和寻址信息 image.png
  • HFileblock: image.png
  • DataBlock:HBase中数据存储的最小文件单元,存储用户的KeyValue数据,是数据表示的最基础单位

image.png

  • Block Index:索引分为单层和多层。
    • 单层:root data index
    • 多层:NonRoot index一般有intermediate和leaf两层,具有相同的结构。

场景:

适用场景:

  • “近在线”的海量分布式KV/宽表存储,数据量级可以达到PB级以上
  • 写密集型、高吞吐应用,可接受一定程度的时延抖动
  • 字典序主键索引、批量顺序扫描多行数据的场景
  • Hadoop大数据生态友好兼容
  • 半结构化数据模型,行列稀疏的数据分布,动态增减列名
  • 敏捷平滑的水平扩展能力,快速响应数据体量、流量变化

典型应用:

  • 电商订单数据
  • 搜索推荐引擎
  • 广告数据流
  • 用户交互数据
  • 时序数据引擎:日志、监控(OpenTSDB)
  • 图存储引擎:JanusGraph
  • 大数据生态:高度融入Hadoop生态

半结构化/字典序有序索引的数据

HBase提供近在线读写的谁推荐候选数据集

查询模式:批量查询指定tenantID租户的指定channelID频道下的推荐候选集

例如:

start rowkey:"part1:tenant1:channel1",

end rowkey:"part1:tenant1:channel2",

  • 对应数据:
    • value:"features(e.g. sport,basketball,...)"
    • column:"additional lables(e.g. region=CN,...)"

"近在线"海量分布式KV/宽表存储

商家订单系统使用HBase管理卖家、卖家的订单操作

生态

  • Phoenix:提供SQL查询HBase里面的数据。一般能够在毫秒级别返回。
  • Spark:Spark Streaming + HBase进行实时广告推荐
  • HGraphDB:分布式图数据库,可以使用其进行图OLTP查询
  • GeoMesa:目前基于NoSQL数据库的时空数据引擎中功能最丰富、社区贡献人数最多的开源系统。提供高效时空索引,支持点、线、面等空间要素存储,百亿级数据实现毫秒(ms)级响应;提供轨迹查询、区域分布统计、区域查询、密度分析、聚合、OD 分析等常用的时空分析功能;提供基于Spark SQL、REST、GeoJSON、OGC服务等多种操作方式,方便地理信息互操作
  • OpenTSDB:可伸缩的时间序列数据库
  • Solr:使用Solr建立二级索引/全文索引

功能

  • Bulkload:大批量向HBase导入数据。使用MapReduce任务直接生成底层存储的HFile文件,并移动到HBase存储目录下。
  • Coprocessor:接口框架,给HBase原生接口添加类似lifecycle hook函数的能力
  • Filter:将过滤逻辑下推到HBase服务端
  • MOB:Medium Object Storage解决HBase对中等大小对象的低延迟读写支持
  • Snapshot:数据备份
  • Replication:将HBase集群中的数据复制到目标HBase集群

架构设计

  • 主要组件:

    • HMaster:元数据管理,集群调度,保活。通常部署一个主节点和一到多个备节点,通过Zookeeper选主。
    • RegionServer:提供数据读写服务,每个实例负责若干个互不重叠的rowkey区间内的数据。
    • ThriftServer:提供Thrift协议访问数据的代理层
  • 依赖组件:

    • Zookeeper:分布式一致共识协作管理,HMaster选主,任务分发,元数据变更管理等
    • HDFS:数据存储

image.png

HMaster

  • CatalogJanitor:定期扫描元数据hbase:meta的变化,回收无用的region
  • AssignmentManager:管理region分配,processAssignQueue方法每当pendingAssignQueue放满RegionStateNode时批量处理。单独启动daemon线程循环处理。

Master故障恢复:故障恢复流程即从master实例从ZK监听到主master节点掉了,抢主成功后执行启动流程。

RegionServer故障恢复:regionserver每次启动的startcode不同,都视为一个新的rs实例,因此走一遍启动流程。

Region Split 热点切分

- 找到切分点:整个region中最大store中的最大HFile文件中最中心的一个block的首个rowkey
- ![image.png](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/3e373c7351bf40849bdc9bccdc393093~tplv-k3u1fbpfcp-watermark.image?) 
- HBase将整个切分过程包装成了一个事务,意图能够保证切分事务的原子性。整个分裂事务过程分为三个阶段:prepare – execute – (rollback)
- prepare阶段:在内存中初始化两个子region,具体是生成两个HRegionInfo对象,包含tableName、regionName、startkey、endkey等。同时会生成一个transaction journal,这个对象用来记录切分的进展
- execute阶段
- ![image.png](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d05d2b471c1e4485a576e86f51e0e9b2~tplv-k3u1fbpfcp-watermark.image?)