深入浅出HBase实战
这是我参与「第四届青训营 」笔记创作活动的第7天
1. Hbase使用场景
1.1 什么是HBase?
HBase是一个开源的NoSQL分布式数据库,是Apache软件基金会顶级项目之一
- 采用存储计算分离架构
- 存储层基于HDFS存储数据,提供容错机制和高可靠性
- 计算层提供灵活快速的水平扩展、负载均衡和故障恢复能力
1.2 HBase和关系型数据库的区别
1.3 HBse数据模型
HBase以列族(column family) 为单位存储数据,以行键(rowkey)索引数据。
- 列族需要在使用前预先创建,列名(column qualifier) 不需要预先声明,因此支持半结构化数据模型
- 支持保留多个版本的数据,(行键 + 列族 + 列名 + 版本号)定位一个具体的值
1.4 适用场景
- “近在线”的海量分布式KV / 宽表存储,数据量级可达到PB级以上
- 写密集型、高吞吐应用,可接受一定程度的时延抖动
- 字典序主键索引、批量顺序扫描多行数据的场景
- Hadoop大数据生态友好兼容
- 半结构化数据模型,行列稀疏的数据分布,动态增减列名
- 敏捷平滑的水平扩展能力,快速响应数据体量、流量变化
1.5 典型应用
- 电商订单数据
- 搜索推荐引擎
- 广告数据流
- 用户交互数据
- 时序数据引擎
- 图存储引擎
- 大数据生态
1.6 HBase数据模型的优缺点
2. HBase架构设计
主要组件
HMaster
元信息管理组件,以及集群调度、保活等功能。通常部署一个主节点和一到多个备节点,通过Zookeeper选主。
RegionServer
提供数据读写服务,每个实例负责一段不重叠的连续rowkey范围内的数据。
ThriftServer
提供一层以Thrift协议访问数据的代理层。
依赖组件
Zookeeper
提供分布式一致性的元数据管理服务。HBase使用Zookeeper实现master节点信息登记、master节点选主、RegionServer信息登记、分布式任务管理等功能。
HDFS
分布式文件系统,HBase数据存储底座
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作分页查询