这是我参与「第四届青训营 」笔记创作活动的第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数据模型的优缺点
1.4 HBase 架构设计
主要组件:
-
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 典型应用
- 电商订单数据:查询最新/待处理订单进度
- 搜索推荐引擎:存储原始数据、排序推荐结果
- 广告数据流:触达、点击、转化等事件流
- 用户交互数据: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 参数调优经验
总结
- 了解了 HBase 的适用场景和数据模型
- 分析了 HBase 的整体架构和模块设计
- 学习了针对大数据场景 HBase 的解决方案
- 了解了 HBase 大规模实战的最佳实践