这是我参与「第四届青训营」笔记创作活动的第6天,学习内容为《深入浅出HBase实战》
HBase适用场景
- HBase数据模型
- 列族为单位存储数据,行族为单位索引数据
- 列族使用前预先创建,列名不需要预先声明,因此支持半结构化数据模型
- 行键+列族+列名+版本号定位一个具体值
- 适合稀疏数据,缺省列不占用存储空间
- 允许批量读取多行列的部分列族/列数据
HBase物理结构
- key-val
- 每个版本的数据都携带全部行列信息
- 不同列族的数据存储在相互独立的物理文件,列族间不保证数据全局有序
- 同列族下不同物理文件间不保证数据全局有序,仅单个物理文件内有序
大数据场景HBase的解决方案
HBase在大数据生态的定位
- 对海量级数据支持强一致、近实时的读写性能
- 支持字典序批量扫描大量数据,只读取部分列族数据,灵活支持不同查询模式
- 存储大规模任务的中间/最终计算结果
- 平滑快速的水平扩展能力,能够敏捷应对大数据场景高速增长的数据体量和大规模的并发访问
- 精细化的资源成本控制,计算层和存储层分别按需扩展,避免资源浪费
水平扩展能力
- 增加Region Server实例,分配部分region到新实例
- 扩展过程平滑,无需搬迁实际数据
- 可用性影响时间很短,用户基本无感知
热点切分
- 当某个region数据量过多,切分成两个独立的子region分摊负载
- RegionServer在特定时机检测region是否应该切分,计算切分点并上报给HMaster
- 不搬迁实际数据,新region数据目录下生成一个以原region文件信息命名的文件,内容是切分点对应的rowkey以及标识新regions是上/下半部分的数据
- 切分点选取
目标:优先把最大的数据文件均匀切分\
步骤
找到表中哪个region的数据大小最大
找到该region哪个列族的数据大小最大
找到该列族内哪个HFile的数据大小最大
找到HFile中处于最中间位置的Data Block
用这个DataBlock的第一条KeyValue的Rowkey作为切分点(第一条最快,block相对于整个很小,因此可以不用选中间的块为切分点)
- 切分过程
- 所有列族都按照统一的切分点来切分数据
- 不保证所有列族的所有文件都被均分
- 切分出的新region分别负责rowkey区间的2000-2500,2500-4000左闭右开
- 每个新region分别负责原region的上/下半部分rowkey区间的数据
- 在compaction执行前不实际切分文件,新region下的文件通过reference file指向原文件读取实际数据
碎片整合
- 某些region数据量过小、碎片化,合并相邻region整合优化数据分布
- 不搬迁实际数据,通过reference file定位原region的文件,直到下次compaction时实际处理数据
- 只允许合并相邻region,否则会打破rowkey空间连续且不重合的约定
负载均衡策略
- 定期巡检各RegionServer上的region数量,保持region的数量均匀分布在各个RegionServer上
- SimpleLoadBalancer
- 计算平均region数,设定弹性上下界
- 降序排序RegionServer,超出上限的迁出,并按照创建时间从新到老排序(最新的可能很热,要分开放)
- 选取region数量低于下限的RegionServer列表,按照round-bin分配上一步的regions(轮流发牌,避免热区域集中在一个RegionServer中)
- 处理边界情况,无法满足所有RS的region数量都在合理范围内,尽量保持region数量接近
- StochasticLoadBalancer:随机尝试不同region放置策略,根据提供的cost function计算不同策略的分值排名
- FavoredNodeLoadBalancer:充分利用本地读写HDFS文件来优化读写性能,每个region会指定优选的3个RegionServer地址,同时会告知HDFS在这些优选节点上放置该region的数据;即使第一节点出现故障,HBase也可以将第二节点提升第一节点,保证稳定的读时延
故障恢复机制
HMaster
- HMaster:HMaster通过多实例基于Zookeeper选主实现高可用性
- 自身恢复流程:主节点挂了触发选主流程,选主成功后执行HMaster启动流程,并继续之前未完成的作业,故障native节点恢复后变成从节点;
- 调度RS故障恢复流程
作者:苦瓜不浮夸233
链接:juejin.cn/post/712951…
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。