大厂Hbase八股文面试题及参考答案(百度米哈游完美世界多家面经汇总)

介绍下 HBase?HBase 优缺点有哪些?

HBase 是一个分布式、面向列的 NoSQL 数据库,基于 Hadoop 的 HDFS 存储系统设计,适合处理海量数据的实时读写需求。它模仿 Google 的 Bigtable 模型,通过强一致性和水平扩展能力支持高并发场景。

核心特点

  • 列式存储:数据按列族(Column Family)组织,适合稀疏数据场景。
  • 强一致性:基于 HDFS 的多副本机制,保证数据可靠性。
  • 自动分片:数据按 Region 自动分片,支持动态扩展。
  • 版本控制:每个单元格(Cell)支持多版本数据存储。

优点

  1. 高扩展性:通过增加 RegionServer 节点轻松扩展集群容量。
  2. 高吞吐与低延迟:LSM 树结构优化写入,BlockCache 提升读取性能。
  3. 灵活数据模型:无需预定义表结构,支持动态列和稀疏数据。
  4. 与 Hadoop 生态无缝集成:可直接使用 MapReduce 或 Spark 进行数据分析。

缺点

  1. 不支持复杂查询:缺乏 SQL 支持,需通过 Scan 或 Filter 实现简单查询。
  2. 单点故障风险:HMaster 负责元数据管理,若未配置高可用可能成为瓶颈。
  3. 内存消耗高:MemStore 和 BlockCache 依赖内存,需合理配置资源。
  4. 无事务支持:仅支持行级原子性,跨行操作需自行处理一致性。

说下 HBase 原理?介绍下 HBase 架构?

HBase 的核心原理基于 LSM 树(Log-Structured Merge Tree),通过将随机写入转换为顺序写入提升性能。数据首先写入内存(MemStore),达到阈值后刷写到磁盘(HFile),后台定期合并小文件以减少读取开销。

架构组成

  • HMaster:负责元数据管理(如表结构、Region 分配)。处理 Region 的负载均衡与故障转移。注意:生产环境需配置多个 HMaster 以避免单点故障。
  • RegionServer:管理多个 Region,处理客户端读写请求。包含 **MemStore(写缓存)**和 BlockCache(读缓存)。
  • ZooKeeper:协调集群状态,监控 RegionServer 存活。存储 HBase 的元数据(如 HMaster 地址)。
  • HDFS:持久化存储 HFile 和预写日志(WAL)。

数据组织

  • 表按行键(Row Key)水平划分为多个 Region,每个 Region 包含连续的行区间。
  • 列族(Column Family)是物理存储单元,不同列族的数据独立存储。

HBase 读写数据流程是怎样的?HBase 的读写缓存是怎样的?在删除 HBase 中的一个数据的时候,它什么时候真正进行删除?

写入流程

  1. 客户端通过 ZooKeeper 定位目标 Region 所在的 RegionServer。
  2. 数据先写入 WAL(Write-Ahead Log),确保故障恢复能力。
  3. 写入 MemStore,内存达到阈值后异步刷写到 HDFS 生成 HFile。

读取流程

  1. 客户端从 ZooKeeper 和 Meta 表获取 Region 位置。
  2. BlockCache → MemStore → HFile 的顺序查找数据,合并结果返回。

读写缓存机制

  • BlockCache:缓存频繁访问的 HFile 数据块(如 Bloom Filter),采用 LRU 策略淘汰。
  • MemStore:写缓存,按列族隔离,刷写后生成新的 HFile。

数据删除逻辑

  • 删除操作会插入一个 墓碑标记(Tombstone),而非立即物理删除数据。
  • 墓碑标记在以下两种场景生效: Minor Compaction:合并 HFile 时跳过标记的数据。Major Compaction:彻底清理标记数据并释放空间。

HBase 中的二级索引是怎样的?

HBase 原生不支持二级索引,但可通过以下方案实现类似功能:

1. 协处理器(Coprocessor)

  • Observer:在数据写入时同步更新索引表。
  • Endpoint:自定义聚合逻辑,但需维护索引一致性。
  • 优点:实时性强,索引与数据同步更新。
  • 缺点:增加写入延迟,索引表可能成为瓶颈。

2. 外部索引表

  • 手动创建独立表存储索引数据(如行键与索引列的映射)。
  • 优点:灵活性高,支持复杂查询。
  • 缺点:需应用层维护一致性,双写可能引入数据不一致。

3. Phoenix

  • 基于 HBase 的 SQL 层,内置全局二级索引(Global Index)和本地索引(Local Index)。
  • 全局索引:独立表存储索引,适合读多写少场景。
  • 本地索引:与数据表共址,写性能更优。

4. Elasticsearch 集成

  • 通过工具(如 Lily)将 HBase 数据同步到 Elasticsearch,利用其全文检索能力。

HBase 的 RegionServer 宕机以后怎么恢复?

恢复流程

  1. 故障检测:ZooKeeper 通过心跳机制检测 RegionServer 宕机,通知 HMaster。
  2. Region 重新分配:HMaster 将宕机节点上的 Region 标记为未分配,并重新分配到其他活跃 RegionServer。
  3. WAL 回放:从 HDFS 读取宕机节点的 WAL 日志,按时间顺序重放未持久化的操作(MemStore 中的数据)。回放完成后,新 RegionServer 对外提供服务。

关键机制

  • WAL 持久化:所有写入操作先记录到 HDFS,确保故障后数据不丢失。
  • Region 副本(可选):HBase 2.0+ 支持 Region 多副本,缩短故障恢复时间。

影响与优化

  • 恢复时间:取决于 WAL 日志大小和网络带宽。
  • 预写日志分割:HMaster 将 WAL 按 Region 切分,并行回放以加速恢复。
  • 避免数据倾斜:合理设计行键,防止单个 RegionServer 负载过重。

HBase 的一个 region 由哪些东西组成?

在 HBase 中,Region 是数据存储和管理的核心单元,每个 Region 对应表中连续的一段行键范围(例如从 row1row100)。其组成结构如下:

  1. Store:每个 Region 按列族(Column Family)划分为多个 Store。例如,若表有 info 和 data 两个列族,则 Region 会包含两个 Store。Store 是物理存储的最小单位,负责管理内存和磁盘数据。
  2. MemStore:每个 Store 对应一个 MemStore(写缓存),用于暂存写入数据。数据写入时先进入 MemStore,排序后刷写到磁盘形成 HFile。
  3. HFile:存储在 HDFS 上的数据文件,采用 LSM 树结构,包含多级索引(如 Bloom Filter 和 Block Index)以加速查询。每个 Store 可能有多个 HFile,后台通过合并(Compaction)优化文件数量和大小。
  4. WAL(预写日志):虽然 WAL 由 RegionServer 全局管理,但每个 Region 的写入操作会记录到 WAL,用于故障恢复。
  5. Region 元数据:包括行键范围、所属表、列族配置等信息,存储在 HBase 的 Meta 表中。

核心作用

  • 水平扩展:Region 分裂(Split)机制允许数据分布到多台机器。
  • 读写隔离:MemStore 处理写入,HFile 处理读取,通过合并平衡性能。

HBase 高可用怎么实现?

HBase 的高可用性通过以下机制保障:

1. HMaster 高可用

  • 部署多个 HMaster 节点,通过 ZooKeeper 选举机制确保主备切换。
  • 主 HMaster 负责元数据管理,备节点监听状态并在主节点宕机时接管。

2. RegionServer 容错

  • ZooKeeper 心跳检测:实时监控 RegionServer 存活状态,宕机时触发 HMaster 重新分配 Region。
  • WAL 回放:RegionServer 故障后,HMaster 从 HDFS 读取其 WAL 日志,在其他节点重放未持久化的数据。

3. 数据持久化

  • HDFS 多副本:默认 3 副本存储 HFile 和 WAL,防止数据丢失。
  • WAL 同步写入:数据先写入 WAL 再进入 MemStore,确保故障时可恢复。

4. Region 副本(HBase 2.0+)

  • 支持为单个 Region 配置多个副本,分布在不同 RegionServer 上。
  • 主副本处理读写,备副本同步数据,主副本宕机时备副本快速接管。

优化建议

  • 避免单点瓶颈:配置至少 3 个 ZooKeeper 节点和 2 个 HMaster。
  • 合理设置超时参数:如 zookeeper.session.timeout 控制故障检测灵敏度。

为什么 HBase 适合写多读少业务?列式数据库的适用场景和优势是什么?列式存储的特点有哪些?

HBase 写多读少的优势

  • LSM 树优化写入:数据先写入内存(MemStore),批量刷盘减少磁盘随机 I/O。
  • 异步合并:后台 Compaction 将小文件合并为大文件,降低读取时的寻址开销。
  • 高吞吐:顺序写入 HDFS 和 WAL,适合日志、时序数据等写入密集型场景。

列式数据库的适用场景

  • OLAP 分析:需扫描大量行但少量列的聚合查询(如 SUM、AVG)。
  • 稀疏数据:列独立存储,适合字段稀疏或动态增减的场景。
  • 高压缩率:同列数据类型一致,压缩效率更高(如 Run-Length 编码)。

列式存储的核心特点

按列存储

每列数据连续存储,减少读取无关列的数据量。

高效压缩

同列数据重复率高,压缩比显著优于行式存储。

延迟物化

仅读取查询涉及的列,减少 I/O 和内存占用。

向量化处理

批量处理同列数据,充分利用 CPU 缓存和 SIMD 指令。

对比行式存储

  • 写入性能:行式存储更适合频繁插入整行数据的场景(如 OLTP)。
  • 读取性能:列式存储在分析型查询中表现更优。

HBase 的 rowkey 设计原则是什么?HBase 的 rowkey 为什么不能超过一定长度?为什么要唯一?rowkey 太长会影响 Hfile 的存储吗?HBase 的 RowKey 设置讲究的原因是什么?

RowKey 设计原则

  1. 唯一性:RowKey 是数据的唯一标识,重复会导致数据覆盖。
  2. 长度控制:建议 10~100 字节,过长会降低 MemStore 和 HFile 索引效率。
  3. 散列分布:避免连续值(如时间戳)导致热点问题,可采用加盐哈希(如 MD5(username)[0:4] + username)。
  4. 查询友好:将常用查询条件前置(如 userid_actiontime)。

RowKey 长度限制的影响

  • 内存开销:每个 RowKey 会存储在 MemStore 和 BlockCache 中,过长会挤占内存空间。
  • HFile 索引膨胀:HFile 的 Bloom Filter 和 Block Index 需记录 RowKey 前缀,长度增加会降低索引效率。
  • 网络传输:RegionServer 需在 RPC 中传递 RowKey,过大会增加序列化开销。

RowKey 必须唯一的原因

  • HBase 中相同 RowKey 的多次写入会视为更新操作,旧版本数据可能被覆盖(取决于版本数配置)。

设计 RowKey 的深层考量

  • 负载均衡:良好的 RowKey 设计可避免 RegionServer 热点,例如将随机前缀(如 hash(userid) % 100)加入 RowKey。
  • 查询性能:RowKey 是唯一全局有序索引,设计需匹配业务查询模式(如范围扫描或精确查询)。

HBase 的大合并、小合并是什么?大合并是如何做的?为什么要大合并?

小合并(Minor Compaction)

  • 触发条件:单个 Store 的 HFile 数量达到阈值(如 hbase.hstore.compactionThreshold=3)。
  • 操作过程:将相邻的多个小 HFile 合并为一个更大的 HFile,减少读取时的文件寻址次数。
  • 特点:仅合并文件,不处理删除标记或过期数据,I/O 开销较低。

大合并(Major Compaction)

  • 触发条件:周期性触发(默认 7 天)或手动执行。
  • 操作过程: 将一个 Store 的所有 HFile 合并为一个新 HFile。清理墓碑标记(Tombstone) 和过期版本数据,释放磁盘空间。更新 HFile 的元数据和索引。
  • 特点:I/O 和计算密集型操作,可能影响集群性能,需避开业务高峰期。

大合并的必要性

  1. 空间回收:物理删除标记数据,避免存储浪费。
  2. 查询优化:减少读取时需要扫描的文件数量,提升性能。

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

17年+码农经历了很多次面试,多次作为面试官面试别人,多次大数据面试和面试别人,深知哪些面试题是会被经常问到。 在多家企业从0到1开发过离线数仓实时数仓等多个大型项目,详细介绍项目架构等企业内部秘不外传的资料,介绍踩过的坑和开发干货,分享多个拿来即用的大数据ETL工具,让小白用户快速入门并精通,指导如何入职后快速上手。 计划更新内容100篇以上,包括一些企业内部秘不外宣的干货,欢迎订阅!

全部评论
物联网用TDEngine好多
点赞 回复 分享
发布于 03-08 21:06 广东
在企业开发,会不用用TDEngine代替Hbase更好?
点赞 回复 分享
发布于 03-02 13:36 广东

相关推荐

05-21 18:32
已编辑
湖南工学院 Java
这条干货多数是给i人朋友们分享的,知道你们开不了口,可以试试我说的这些方法1.调整心态:接受初期的尴尬刚开始进入一个新环境,双方都属于一个认识对方的过程,尴尬瞬间是难免存在的。首先,你要接受尴尬,允许自己犯错,实习期本身就是来学习的,同事也不会期待你完美无缺。另外,不要太以自我为中心,其实你的尴尬瞬间也许没有人在意,是因你的对自己的关注而放大了不安全感。2.准备一些防止尴尬的话题和工作相关的,可以以请教的方式开启。比如:xx,这个表格我没有看懂,可以给我讲一下吗非工作的话题,可以聊聊中午吃什么、当地的天气如何、通勤远不远之类的。比如:附近有什么好吃的外卖吗?我刚来还不太熟悉3.每日练习,逐渐打...
sweep^0416:内向人,遇到好的领导很重要,我之前一段实习组里全e人就我一个i 刚入职第一周还会带着我聊一下,后面越来越冷落我,实在受不了,每天去到就想亖,mentor还要pua说是我融入不了集体(我真的以为是我的问题)后面我离职了,去了现在这一家公司,我的领导也是e人,但是我融入的很好,组里的人全都很好很好,也不会出现小团体什么的,所以说内向不是不融入环境的根本,就是公司跟带教的问题
点赞 评论 收藏
分享
Cherrycola01:0实习 0项目 约等于啥也没有啊 哥们儿这简历认真的吗
点赞 评论 收藏
分享
评论
2
12
分享

创作者周榜

更多
牛客网
牛客企业服务