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

111 阅读3分钟

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

课程资料

课程链接:live.juejin.cn/4354/yc_HBa…

课程PPT:bytedance.feishu.cn/file/boxcn3…

学员手册:juejin.cn/post/712681…

完整手册:bytedance.feishu.cn/docx/doxcnE…

一、HBase适用场景

HBase特性

image-20220806133557427

HBase数据模型

HBase以列族为单位存储数据,以行键索引数据

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

image-20220806133839371

简单起见可以将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大数据生态
  • 结构化、半结构化数据,可以经常新增/更新列属性
  • 平滑的水平扩展

image-20220806134644104

优缺点

image-20220806134733992

二、HBase架构设计

主要组件

image-20220806134854856

  • HMaster:元数据管理、集群调度、保活
  • RegionServer:提供数据读写服务,每个实例负责若干个互不重叠的rowkey区间内的数据
  • ThriftServer:提供Thrift API读写代理层
  • Zookeeper:分布式一致性共识协作管理,例如HMaster选主、任务分发、元数据变更管理
  • HDFS:分布式文件系统,HBase数据存储底座

三、大数据支撑

HBase在大数据生态的定位

  • 对TB、PB级海量数据支持强一致、近实时的读写性能,支持快速的ad-hoc分析查询任务
  • 支持字典序批量扫描大量数据,支持只读取部分列族的数据,灵活支持不同的查询模式,避免读取不必要的数据
  • 存储大规模任务(MapReduce、Spark、Flink)的中间/最终计算结果
  • 平滑快速的水平扩展能力,能够敏捷应对大数据高速增长的数据体量和大规模的并发访问
  • 精细化的资源成本控制,计算层和存储层分别按需扩展,避免资源浪费

水平扩展

image-20220806135835772

  • 增加RegionServer实例,分配部分region到新实例
  • 扩展过程平滑,无序搬迁实际数据
  • 可用性影响时间很短,用户基本无感知

Region热点切分

  • 找到该表中哪个region的数据最大
  • 找到该region内哪个column family的数据最大
  • 找到column family内哪个HFile的数据大小最大

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

image-20220806140122323

  • 找到HFile里处于最中间位置的Data Block
  • 用这个Data Block的第一条KeyValue的Rowkey作为切分点

image-20220806140508750

Region碎片整合

image-20220806140654454

Region负载均衡

image-20220806140755341

  • 根据总的region数量和RegionServer的数量计算平均的region数量,设定弹性上下界避免不必要的操作,例如默认slop为0.2,平均region数量为5,则负载均衡的RS上的region的数量为[4, 6]
  • 将RegionServer按照region数量降序排序,对region数量超出上界的选取需要迁出region并且按照创建时间从新到老排序
  • 选出region数量低于下限的RS列表,round-robin分配步骤2选出的regions
  • 处理边界情况,尽量保证region数量接近

\