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

77 阅读5分钟

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

1. Hbase简介

Apache HBase是一个开源,分布式,版本化,非关系数据库

特征

  • 线性和模块化可扩展性。
  • 严格一致的读取和写入。
  • 自动和可配置的表分片
  • 区域服务器之间的自动故障转移支持。
  • 方便的基类,用于使用Apache HBase表支持Hadoop MapReduce作业。
  • 易于使用的 Java API 用于客户端访问。
  • 用于实时查询的块缓存和 Bloom 过滤器。
  • 通过服务器端筛选器向下推送查询谓词
  • 节俭网关和支持 XML、Protobuf 和二进制数据编码选项的 REST-ful Web 服务
  • 可扩展的基于 jruby 的 (JIRB) shell
  • 支持通过Hadoop指标子系统将指标导出到文件或Ganglia;或通过 JMX

1.2 HBase 与关系型数据库的区别

  • 数据结构:半结构化,无数据类型;按列族稀疏存储,缺省数据不占用存储空间;支持多版本数据
  • 读写模式:支持按需读写部分列
  • 事务支持:仅支持行内原子性
  • 数据规模:适用于TB、PB级海量数据,水平扩展快速平滑
  • 索引支持:仅支持rowkey主键索引

1.3 HBase 数据模型

HBase以列族(column family)组织数据,以行键(rowkey)索引数据

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

1.3.1 物理结构

  • 物理数据结构的最小单元是 KeyValue 结构
  • 每个版本的数据都携带全部行列信息
  • 同一行、同一列族的数据物理上连续有序存储

1.3.2 HBase数据模型的优缺点

image.png

1.4 HBase 架构设计

image.png

主要组件:

  • HMaster:元数据管理,集群调度、保活

    • 管理RegionServer的生命周期,保证服务可用性
    • 协调RegionServer数据故障恢复,保证数据正确性
    • 集中管理集群元数据,执行负载均衡等维护集群稳定性
    • 定期巡检元数据,调整数据分布,清理废弃数据等
    • 处理用户主动发起的元数据操作,如建表、删表等
  • RegionServer:提供数据读写服务,每个实例负责若干个互不重叠的rowkey区间内的数据

    • 提供部分rowkey区间数据的读写服务
    • 如果负责meta表,向客户端SDK提供rowkey位置信息
    • 认领HMaster发布的故障恢复任务,帮助加快数据恢复过程
    • 处理HMaster下达的元数据操作,如region打开/关闭/分裂/合并操作等
  • ThriftServer:提供Thrift API读写的代理层

依赖组件:

  • ZooKeeper:分布式一致性共识协作管理,例如HMaster选主、任务分发、元数据变更管理等
  • HDFS:分布式文件系统,HBase的数据存储底座

2. 使用场景

2.1 适用场景

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

2.2 典型应用

image.png

  • 电商订单数据:查询最新/待处理订单进度
  • 搜索推荐引擎:存储原始数据、排序推荐结果
  • 广告数据流:触达、点击、转化等事件流
  • 用户交互数据:IM、Email、点赞、搜索
  • 时序数据引擎:日志、监控(OpenTSDB)
  • 图存储引擎:JanusGraph
  • 大数据生态:高度融入Hadoop生态

3. 实践

3.1 rowkey设计策略

场景分类

1.不需要顺序扫描批量连续rowkey 对原始rowkey 做哈希(如MD5),作为真实rowkey的前缀。建议取适当长度的子串,避免过多占用存储空间。

2.需要顺序扫描批量连续rowkey 首先用grouplDlapplD/userID前缀避免数据热点,然后加上定义顺序的信息(如时间戳等)ID前缀也建议哈希处理,避免非预期的热点。

3.rowkey长度尽量保持较短,因为会冗余存储到每个KeyValue中。 避免用时间戳直接作为rowkey前缀,会导致最新的数据始终集中在单个RegionServer 上,造成热点瓶颈,且无法通过水平扩容缓解。

3.2 lumn family设计策略

1.Column family数量过多容易影响性能,建议尽量少,不超过5个。

2.需要同时读取的数据尽量放在相同列族,反之尽量放在不同列族, 读取时尽量只读取必需的列族,避免读不必要的列族。

3.列族(以及column qualifier)名称尽量短,因为会冗余存储到每个 KeyValue 中。

3.3 参数调优经验

image.png

总结

  1. 了解了 HBase 的适用场景和数据模型
  2. 分析了 HBase 的整体架构和模块设计
  3. 学习了针对大数据场景 HBase 的解决方案
  4. 了解了 HBase 大规模实战的最佳实践

参考

  1. 【大数据专场 学习资料四】第四届字节跳动青训营 - 掘金 (juejin.cn)
  2. Apache HBase – Apache HBase™ Home
  3. HBase – 有态度的HBase/Spark/BigData (hbasefly.com)