课程资料
课程链接:https://live.juejin.cn/4354/yc_HBase
课程PPT:https://bytedance.feishu.cn/file/boxcn3OIZS5YiWoCJFXxLLuHhvh
学员手册:https://juejin.cn/post/7126813033602482190/#heading-0
完整手册:https://bytedance.feishu.cn/docx/doxcnECGEFkCKYqbxaDipK1qrVf
一、HBase适用场景
HBase特性
HBase数据模型
HBase以列族为单位存储数据,以行键索引数据
- 列族需要在使用前预先创建,列名不需要预先声明,因此支持半结构化数据模型
- 支持保留多个版本的数据,(行键+列族+列名+版本号)定位一个具体的值
简单起见可以将HBase数据格式理解为如下数据结构:
// table名格式:"${namespace}:${table}"
// 例如:table = "default:test_table"
[
"rowKey1": { // rowkey定位一行数据
"cf1": { // column family需要预先定义到表结构
"cq_a": { // column qualifier无需定义,使用任意值
"timestamp3": "value3",
// row=rowKey1, column="cf1:cf_a", timestamp=timestamp2
// 定位一个cell
"timestamp2": "value2",
"timestamp1": "value1"
},
"cq_b": {
"timestamp2": "value2",
"timestamp1": "value1"
}
},
"cf3": {
"cq_m": {
"timestamp1": "value1"
},
"cq_n": {
"timestamp1": "value1"
}
},
},
"rowKey3": {
"cf2": { // 缺省column family不占用存储空间
"cq_x": {
"timestamp3": "value3",
"timestamp2": "value2",
"timestamp1": "value1"
},
"cq_y": {
"timestamp1": "value1"
}
},
}
]
使用场景
- “近在线”的海量分布式KV/宽表存储,数据量级达到百TB级以上
- 写密集型应用,高吞吐,可接受一定的时延抖动
- 需要按行顺序扫描的能力
- 接入Hadoop大数据生态
- 结构化、半结构化数据,可以经常新增/更新列属性
- 平滑的水平扩展
优缺点
二、HBase架构设计
主要组件
- HMaster:元数据管理、集群调度、保活
- RegionServer:提供数据读写服务,每个实例负责若干个互不重叠的rowkey区间内的数据
- ThriftServer:提供Thrift API读写代理层
- Zookeeper:分布式一致性共识协作管理,例如HMaster选主、任务分发、元数据变更管理
- HDFS:分布式文件系统,HBase数据存储底座
三、大数据支撑
HBase在大数据生态的定位
- 对TB、PB级海量数据支持强一致、近实时的读写性能,支持快速的ad-hoc分析查询任务
- 支持字典序批量扫描大量数据,支持只读取部分列族的数据,灵活支持不同的查询模式,避免读取不必要的数据
- 存储大规模任务(MapReduce、Spark、Flink)的中间/最终计算结果
- 平滑快速的水平扩展能力,能够敏捷应对大数据高速增长的数据体量和大规模的并发访问
- 精细化的资源成本控制,计算层和存储层分别按需扩展,避免资源浪费
水平扩展
- 增加RegionServer实例,分配部分region到新实例
- 扩展过程平滑,无序搬迁实际数据
- 可用性影响时间很短,用户基本无感知
Region热点切分
- 找到该表中哪个region的数据最大
- 找到该region内哪个column family的数据最大
- 找到column family内哪个HFile的数据大小最大
这是我参与「第四届青训营 」笔记创作活动的的第8天
- 找到HFile里处于最中间位置的Data Block
- 用这个Data Block的第一条KeyValue的Rowkey作为切分点
Region碎片整合
Region负载均衡
- 根据总的region数量和RegionServer的数量计算平均的region数量,设定弹性上下界避免不必要的操作,例如默认slop为0.2,平均region数量为5,则负载均衡的RS上的region的数量为[4, 6]
- 将RegionServer按照region数量降序排序,对region数量超出上界的选取需要迁出region并且按照创建时间从新到老排序
- 选出region数量低于下限的RS列表,round-robin分配步骤2选出的regions
- 处理边界情况,尽量保证region数量接近
\