<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>HBase on 小蜜蜂</title>
        <link>https://xumf.net/tags/hbase/</link>
        <description>Recent content in HBase on 小蜜蜂</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh</language>
        <lastBuildDate>Wed, 15 Aug 2018 15:43:54 +0800</lastBuildDate><atom:link href="https://xumf.net/tags/hbase/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>HBase 深入浅出</title>
            <link>https://xumf.net/blog/hbase/</link>
            <pubDate>Wed, 15 Aug 2018 15:43:54 +0800</pubDate>
            <guid>https://xumf.net/blog/hbase/</guid>
            <description>&lt;h2 id=&#34;为什么需要-hbase&#34;&gt;为什么需要 HBase？&#xA;&lt;/h2&gt;&lt;p&gt;传统关系型数据库在数据量达到 TB 级、写入吞吐量达到每秒百万行时会出现瓶颈：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;MySQL 分库分表后跨节点 Join/聚合困难&lt;/li&gt;&#xA;&lt;li&gt;写入吞吐受限于单机 B+Tree 的随机写性能&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;HBase 的解决思路：&lt;strong&gt;LSM-Tree + 列式存储 + 水平扩展&lt;/strong&gt;。它将随机写转为顺序写（先写内存再刷盘），通过 Region 自动分裂实现水平扩展。&lt;/p&gt;&#xA;&lt;h2 id=&#34;1-hbase-核心组件&#34;&gt;1. HBase 核心组件&#xA;&lt;/h2&gt;&lt;h3 id=&#34;11-hmaster&#34;&gt;1.1 HMaster&#xA;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;源码路径&lt;/strong&gt;：&lt;code&gt;org.apache.hadoop.hbase.master.HMaster&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;核心职责：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;元数据管理&lt;/strong&gt;：处理 DDL（创建/删除/修改表），维护 &lt;code&gt;hbase:meta&lt;/code&gt; 表&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;负载均衡&lt;/strong&gt;：监控 RegionServer 负载，分配/迁移 Region&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;故障恢复&lt;/strong&gt;：RegionServer 宕机时重新分配其 Region&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;启动流程&lt;/strong&gt;：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;连接 ZooKeeper，尝试创建 HMaster 临时节点（选主）&lt;/li&gt;&#xA;&lt;li&gt;加载 &lt;code&gt;hbase:meta&lt;/code&gt; 表，获取所有 Region 分布信息&lt;/li&gt;&#xA;&lt;li&gt;启动后台线程：LoadBalancer（定期均衡 Region）、CatalogJanitor（清理 meta 中的无效条目）&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&lt;strong&gt;高可用机制&lt;/strong&gt;：通过 ZooKeeper 选举，同一时间只有一个活跃 HMaster。Standby HMaster 监听活跃节点，发现 znode 消失后立刻尝试成为主。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;面试常见问题：HMaster 宕机后 HBase 还能工作吗？&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;可以。读写操作由 RegionServer 直接处理，HMaster 只负责 DDL 和负载均衡。已有表的读写不受影响，但无法创建新表或修改表结构。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;12-regionserver&#34;&gt;1.2 RegionServer&#xA;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;源码路径&lt;/strong&gt;：&lt;code&gt;org.apache.hadoop.hbase.regionserver.HRegionServer&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;核心职责与架构：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;┌─────────────────── RegionServer ───────────────────┐&#xA;│  ┌────────┐  ┌────────┐  ┌────────┐                │&#xA;│  │ Region1 │  │ Region2 │  │ Region3 │  ← 每个 Region 负责一段 RowKey 范围&#xA;│  └────┬───┘  └────┬───┘  └────┬───┘                │&#xA;│       │           │           │                     │&#xA;│  ┌────▼───────────▼───────────▼─────┐               │&#xA;│  │  Store(ColumnFamily: info)       │               │&#xA;│  │  ┌────────────┐ ┌─────────────┐ │               │&#xA;│  │  │ MemStore   │ │ StoreFile   │ │               │&#xA;│  │  │(SkipList)  │ │ (HFile × N) │ │               │&#xA;│  │  └────────────┘ └─────────────┘ │               │&#xA;│  ├──────────────────────────────────┤               │&#xA;│  │ BlockCache (LruBlockCache)       │               │&#xA;│  │ WAL (Write Ahead Log → HDFS)    │               │&#xA;│  └──────────────────────────────────┘               │&#xA;└────────────────────────────────────────────────────┘&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&#34;写流程详解&#34;&gt;写流程详解&#xA;&lt;/h4&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Client → RegionServer&#xA;  1️⃣ 写入 WAL（HDFS，保证不丢数据）&#xA;  2️⃣ 写入 MemStore（ConcurrentSkipListMap，有序）&#xA;  ─── 返回成功给客户端 ───&#xA;  3️⃣ 后台 Flush 线程：当 MemStore 达到阈值（128MB）→ 生成 HFile&#xA;  4️⃣ 后台 Compaction：合并小 HFile，删除已删除/过期的数据&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;写入为什么先写 WAL 再写 MemStore？&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;WAL 在 HDFS 上（多副本），RegionServer 宕机后可以通过 WAL 恢复 MemStore 中未刷盘的数据&lt;/li&gt;&#xA;&lt;li&gt;WAL 使用顺序写（HDFS Append），性能远高于随机写&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;为什么 MemStore 用 ConcurrentSkipListMap？&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;数据按 RowKey 排序存储——HFile 要求数据有序，这样可以顺序写入&lt;/li&gt;&#xA;&lt;li&gt;ConcurrentSkipListMap 支持 O(log N) 的插入和查找，同时线程安全&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;读流程详解&#34;&gt;读流程详解&#xA;&lt;/h4&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Client → RegionServer&#xA;  1️⃣ 查询 BlockCache（LruBlockCache，缓存热点 HFile Block）&#xA;  2️⃣ 未命中 → 查询 MemStore（未刷盘的最新数据）&#xA;  3️⃣ 未命中 → 查询 HFile（Bloom Filter 先过滤，跳过不含该 RowKey 的文件）&#xA;  4️⃣ 合并所有结果（MemStore + 多个 HFile），按时间戳取最新版本&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;BlockCache vs MemStore&lt;/strong&gt;：MemStore 存的是还没写入 HFile 的数据（写缓存），BlockCache 缓存已读过的 HFile Block（读缓存）。两者分离，避免写操作影响读缓存。&lt;/p&gt;&#xA;&lt;h3 id=&#34;13-region&#34;&gt;1.3 Region&#xA;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;源码路径&lt;/strong&gt;：&lt;code&gt;org.apache.hadoop.hbase.regionserver.HRegion&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;Region 按 RowKey 范围水平切分表数据。每个 Region 包含多个 Store（每列族一个）。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Region 分裂流程&lt;/strong&gt;：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;1. RegionServer 检测 Region 大小超过阈值 (hbase.hregion.max.filesize, 默认 10GB)&#xA;2. 将 Region 下线（短暂不可用）&#xA;3. 找到 Region 的中点 RowKey，拆分为两个子 Region&#xA;4. 在 hbase:meta 中更新 Region 信息&#xA;5. 两个子 Region 上线，客户端刷新 meta 缓存后路由到新 Region&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;分裂对读写的影响：分裂期间该 Region 短暂不可用（毫秒级），通过 WAL 和 Meta 更新保证一致性。&lt;/p&gt;&#xA;&lt;h3 id=&#34;14-walwrite-ahead-log&#34;&gt;1.4 WAL（Write Ahead Log）&#xA;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;源码路径&lt;/strong&gt;：&lt;code&gt;org.apache.hadoop.hbase.wal.WAL&lt;/code&gt;&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;每次写入流程：&#xA;1. RegionServer 将写入操作封装为 WALEdit&#xA;2. 通过 FSHLog 写入 HDFS 上的 WAL 文件（顺序追加，高性能）&#xA;3. 写入成功后，再写入 MemStore&#xA;4. 当 MemStore 刷盘成功 → 该部分 WAL 可截断&#xA;&#xA;崩溃恢复流程：&#xA;1. RegionServer 宕机 → HMaster 感知（通过 ZooKeeper Session 超时）&#xA;2. HMaster 将该 RS 上的 Region 重新分配给其他 RS&#xA;3. 新 RS 加载 WAL，回放数据到 MemStore&#xA;4. MemStore 刷盘后，数据恢复完成&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;WAL 性能优化&lt;/strong&gt;：默认是同步写入（每条写入都 fsync），可通过 &lt;code&gt;hbase.wal.hsync=false&lt;/code&gt; 改为异步（风险：RegionServer 进程级崩溃可能丢失少量数据）。&lt;/p&gt;&#xA;&lt;h2 id=&#34;2-hbase-读写流程深入&#34;&gt;2. HBase 读写流程深入&#xA;&lt;/h2&gt;&lt;h3 id=&#34;21-完整写入流程含客户端侧&#34;&gt;2.1 完整写入流程（含客户端侧）&#xA;&lt;/h3&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;1. 客户端从 hbase:meta 获取 RowKey 对应的 RegionServer&#xA;2. 客户端直连该 RegionServer（无中间代理）&#xA;3. RegionServer 接收请求 → 写入 WAL（多副本到 HDFS）&#xA;4. 写入 MemStore（ConcurrentSkipListMap）&#xA;5. 返回成功给客户端&#xA;6. 异步 Flush 线程在 MemStore 达到 128MB（`hbase.hregion.memstore.flush.size`）时：&#xA;   ├─ 在窗口中保持最新写入（不阻塞）&#xA;   ├─ 将当前 MemStore 快照转换为不可变数据&#xA;   └─ 写入 HFile（按照 RowKey 顺序）&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;数据一致性保证&lt;/strong&gt;：WAL（HDFS 3 副本）+ MemStore 的 Snapshot + Flush 机制确保即使 RS 宕机也不会丢数据。&lt;/p&gt;&#xA;&lt;h3 id=&#34;22-完整读取流程&#34;&gt;2.2 完整读取流程&#xA;&lt;/h3&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;1. 客户端从 hbase:meta 获取 RowKey 对应的 RegionServer&#xA;2. 客户端直连该 RegionServer&#xA;3. RegionServer 创建 scanner：&#xA;   ├─ 构建读取路径：MemStore + BlockCache + 所有相关 HFile&#xA;   └─ 合并结果（按 RowKey + TimeStamp + Type 排序）&#xA;4. 返回查询结果（逐行或批量）&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;读性能优化&lt;/strong&gt;：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Bloom Filter&lt;/strong&gt;：跳过不含目标 RowKey 的 HFile，减少 I/O。布隆过滤器会占用内存（每个 HFile 约 1% 额外空间），但可大幅提升随机读性能&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;BlockCache&lt;/strong&gt;：缓存热点 HFile Block（Block 默认 64KB），顺序读取时命中率高&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;预分区（Pre-splitting）&lt;/strong&gt;：建表时指定 Region 数量和 split 点，避免单 Region 热点&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;压缩&lt;/strong&gt;：Snappy 压缩 HFile（CPU 开销小，压缩比约 2:1），减少磁盘 I/O&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;3-高级特性&#34;&gt;3. 高级特性&#xA;&lt;/h2&gt;&lt;h3 id=&#34;31-协处理器coprocessor&#34;&gt;3.1 协处理器（Coprocessor）&#xA;&lt;/h3&gt;&lt;p&gt;类似数据库的触发器（Observer）和存储过程（Endpoint）。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Observer&lt;/strong&gt;：拦截 HBase 操作，在执行前后注入自定义逻辑。&lt;/p&gt;&#xA;&lt;p&gt;应用场景：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;二级索引&lt;/strong&gt;：Put 操作时写入索引表（Observer 拦截 postPut）&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;权限校验&lt;/strong&gt;：Get 操作前检查用户权限（Observer 拦截 preGet）&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;审计日志&lt;/strong&gt;：记录所有 DML 操作&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;Endpoint&lt;/strong&gt;：在 RegionServer 上执行聚合计算，避免客户端拉回大量数据。&lt;/p&gt;&#xA;&lt;p&gt;场景示例：统计某个表的总行数——不通过 Endpoint 的话需要 Scan 全表拉回客户端，通过 Endpoint 各 Region 并行统计后返回汇总结果。&lt;/p&gt;&#xA;&lt;h3 id=&#34;32-压缩与编码&#34;&gt;3.2 压缩与编码&#xA;&lt;/h3&gt;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;压缩算法&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;压缩比&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;CPU 开销&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;场景&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;GZIP&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;最高&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;最高&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;归档数据，读少&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Snappy&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;中（~2:1）&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;低&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;平衡型（热数据推荐）&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;LZO&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;中&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;中&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;兼容性差（需安装 native lib）&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;ZSTD&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;高&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;中&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;JDK 11+，Facebook 开发&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;设置方式：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 建表时指定&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;create &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;mytable&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt; NAME &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&amp;gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;cf&amp;#39;&lt;/span&gt;, COMPRESSION &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&amp;gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;SNAPPY&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 已有表修改&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;alter &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;mytable&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt; NAME &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&amp;gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;cf&amp;#39;&lt;/span&gt;, COMPRESSION &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&amp;gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;GZ&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;4-实战排查&#34;&gt;4. 实战排查&#xA;&lt;/h2&gt;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;RegionServer 内存溢出（OOM）&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;症状：RS 进程消失，HMaster 重新分配 Region&lt;/li&gt;&#xA;&lt;li&gt;检查 MemStore 大小：&lt;code&gt;hbase.hregion.memstore.flush.size&lt;/code&gt; × Region 数量 = RS 写缓冲区总量&lt;/li&gt;&#xA;&lt;li&gt;通常原因为 Region 过多导致 MemStore 总和超过 RS 堆内存——降低 &lt;code&gt;hbase.regionserver.global.memstore.size&lt;/code&gt;（默认 0.4，即 40% 堆内存）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;读延迟高&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;BlockCache 命中率低：增大 &lt;code&gt;hfile.block.cache.size&lt;/code&gt;（默认 0.4）&lt;/li&gt;&#xA;&lt;li&gt;HFile 数量过多：触发 Major Compaction 合并（但 Major Compaction 期间 I/O 压力大）&lt;/li&gt;&#xA;&lt;li&gt;Bloom Filter 未开启：建表时 &lt;code&gt;BLOOMFILTER =&amp;gt; &#39;ROW&#39;&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;Region 热点&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;原因：RowKey 设计不合理，顺序递增导致所有写请求打在一个 Region 上&lt;/li&gt;&#xA;&lt;li&gt;解决方案：RowKey 加盐（前缀 hash）——如 &lt;code&gt;MD5(id).substring(0,4) + id&lt;/code&gt; 使数据均匀分布&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;Major Compaction 影响读写&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Major Compaction 合并所有 HFile，I/O 消耗大&lt;/li&gt;&#xA;&lt;li&gt;建议在低峰期触发：&lt;code&gt;hbase.hregion.majorcompaction&lt;/code&gt; 设置为 0（关闭自动），通过 crontab 手动触发&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;ZooKeeper Session 超时导致 RegionServer 被误判宕机&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;检查 GC 日志——长时间的 Full GC 可能让 ZK 认为 RS 失联&lt;/li&gt;&#xA;&lt;li&gt;调大 &lt;code&gt;zookeeper.session.timeout&lt;/code&gt;（默认 90 秒），或缩短 GC 暂停时间&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;</description>
        </item></channel>
</rss>
