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

106 阅读3分钟

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

1. Hbase使用场景

1.1 什么是HBase?

HBase是一个开源的NoSQL分布式数据库,是Apache软件基金会顶级项目之一

  • 采用存储计算分离架构

    • 存储层基于HDFS存储数据,提供容错机制和高可靠性
    • 计算层提供灵活快速的水平扩展、负载均衡和故障恢复能力

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

image-20220830163329039

1.3 HBse数据模型

HBase以列族(column family) 为单位存储数据,以行键(rowkey)索引数据。

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

image-20220830163729185

1.4 适用场景

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

1.5 典型应用

  • 电商订单数据
  • 搜索推荐引擎
  • 广告数据流
  • 用户交互数据
  • 时序数据引擎
  • 图存储引擎
  • 大数据生态

1.6 HBase数据模型的优缺点

image-20220830164439856

2. HBase架构设计

主要组件

HMaster

元信息管理组件,以及集群调度、保活等功能。通常部署一个主节点和一到多个备节点,通过Zookeeper选主。

RegionServer

提供数据读写服务,每个实例负责一段不重叠的连续rowkey范围内的数据。

ThriftServer

提供一层以Thrift协议访问数据的代理层。

依赖组件

Zookeeper

提供分布式一致性的元数据管理服务。HBase使用Zookeeper实现master节点信息登记、master节点选主、RegionServer信息登记、分布式任务管理等功能。

HDFS

分布式文件系统,HBase数据存储底座

image-20220830165810079

3. 最佳实践

3.1 rowkey设计

  • 最大长度是64KB,实际应用中长度一般为 10 ~ 100bytes。key在保证功能的前提下建议越短越好,因为key是冗余到每个cell存储的,过长的key会占用更多存储、缓存空间。
  • 设计Key时,要充分利用排序存储这个特性,将经常一起读取的行存储到一起。HBase以HFile文件块为单位从HDFS读取数据,一次性读出相邻相关数据可以达到随机读变成顺序读的效果。

但同时要防止出现热key聚焦打爆region server实例。

反例:以时间戳作rowkey前缀,一段时间的请求会全部打到同一regionserver。

3.2 Column family数量

过多的cf会影响HBase性能,建议不超过3个。

3.3 value大小

建议不要超过1MB。过大的value会影响HBase读写性能。可以将实际value存储在其他对象存储系统,在HBase的value存储其位置信息。

3.4 Region数量

一个region的大小最好在10-50GB之间。

3.5 mapreduce的应用在低峰期运行

批处理任务建议在业务低峰期运行,并且需要对HBase的访问流量进行一定限制。

3.6 尽量复用client实例

新建client实例需要访问Zookeeper和元信息表所在regionserver,频繁操作有打垮服务的风险。

3.7 client参数调优

  • nodelay设置true
  • 读较多的应用中gc的新生代不能设置太小
  • 数据版本尽可能少来增加有效缓存容量,提升命中率
  • 避免一次scan过多的row,尽量拆分为多次小规模scan作分页查询