资讯动态

行式存储在大数据时代为何没过时?从HBase到TiDB的演进与实践

发布时间:2026/9/11 9:22:52 来源:尧图企业网站定制
聊到大数据存储行式存储现在有点“姥姥不疼舅舅不爱”的意思。带过几届做大数据毕设的学生也面过不少从培训班出来投大数据开发岗位的候选人问起行式存储最普遍的回答是“大数据时代不都该用列式存储吗Parquet、ORC那些才是正道。”这话我年轻的时候也信。直到在一个日活过千万的在线产品里我们辛辛苦苦把订单和用户画像数据全数进了列式数仓结果被一个“按用户ID查最近一笔订单”的实时接口按在地上摩擦才反应过来——行式存储在大数据场景里不仅没过时反而在技术变革中长出了完全不同的新形态。这篇文章我会把行式存储在大数据体系里的定位、演进历程、适用场景、选型方式和调优经验一次讲透。不绕弯子直接上干货。无论你是准备大数据相关的毕业设计还是在刷大数据面试题又或是已经入了大数据开发的门、想在数据科学与大数据技术方向上走得更扎实这篇文章都能给你一个比“行式 vs 列式”更完整的视角。1. 行式存储没有过时先看清它与列式存储的分工本质很多人对行式存储的理解停留在“MySQL用行式大数据用列式”这种贴标签层面。但真实的数据世界不是二选一。要理解行式存储的变革你得先搞清楚它到底解决了什么问题以及为什么这些问题在大数据时代不但没有消失反而被放大了。1.1 行式存储的底层逻辑一次取整行天然事务友好行式存储把一条记录的多个字段连续存放在一起。以MySQL InnoDB为例BTree的叶子节点上主键索引定位到某一行的代价极其低取出这行时这一行的所有列都能立刻拿到不需要再去别的地方拼接。这事用类比说最好懂。行式存储像医院的纸质病历每个患者一本护士拿着病历本就能查到“张三个人基本信息、既往病史、用药记录”一次翻出全部信息。列式存储则像体检中心的做法几百个人的血常规结果放一堆几百个人的胸片放另一堆。要做“这批人里有多少人血糖偏高”的统计列式效率极高但护士想查“张三今天来复查的完整情况”就得从好几堆资料里翻出属于张三的那一张拼在一起。这个底层逻辑决定了行式存储的核心价值面向记录的点查、小范围扫描、以及高频率的增删改。数据库里所说的ACID事务正是建立在“行”这个粒度上的——一行数据的修改可以配合锁和日志做精确控制。大数据处理的是海量数据不假但海量数据里总有那么一部分请求要“精确捞某一条”这一部分永远存在。1.2 列式存储的强项与短板分析高效但按行更新代价很大列式存储走上大数据舞台首要功臣是压缩率。同一列的数据类型一致、取值分布相对集中压缩算法能吃到超高性价比的红利。比如性别列、状态列这种低基数字段字典编码后可能压缩到原来的十分之一甚至更低。再加上查询引擎只需要读取涉及到的列文件、跳过无关列扫描大量数据做聚合分析时的IO开销大幅下降。代价也明显。在Parquet这类列式文件里更新一行的一列往往意味着要把多个列块甚至整个RowGroup改写一遍IO放大极其难受。虽然Hive、Spark生态里可以靠“重写分区”来变相更新但那是批处理思路延迟和高昂代价摆在那里。如果把在线订单、账户余额这种强一致、高频更新的数据硬塞进列式存储那基本就是自找麻烦。1.3 行式与列式核心能力对比对比项行式存储列式存储典型引擎/格式MySQL、HBase、TiDB、RocksDBParquet、ORC、ClickHouse部分场景数据存放粒度一行记录连续存放一列数据连续存放单行点查极快一次IO可拿到全行需要跨列块读取拼接慢聚合分析需要扫描大量无关列慢只扫必要列快压缩率同列数据不连续压缩率一般同列类型一致压缩率很高更新/删除天然支持可按行定位修改重写代价大适合批量覆盖事务支持强容易实现行级锁和日志恢复弱多数引擎不提供ACID适用场景OLTP、在线服务、KV点查、实时维表OLAP、离线数仓、多维分析1.4 变革的本质边界更清晰而不是互相替代回到标题说的“技术变革”。我理解的行式存储变革不是行式某一天突然变得比列式厉害而是大数据基础设施把行式存储的分布式能力、并发能力、扩展能力补上了。过去行式存储只能单机跑容量和吞吐都有上限现在行式存储可以在几十台甚至上百台机器上跑还能保持低延迟和高可用。所以真正的大数据技术栈里行式与列式是互补关系行式守护在线交易和实时点查列式承接离线分析和批量聚合。两者之间的数据通过同步链路流动共同组成完整的数据生命周期。2. 从单机BTree到分布式LSM Tree行式存储的三次技术跃迁行式存储在大数据领域的变革我习惯把它拆成三个阶段。每个阶段都是被真实业务需求逼出来的不是某家公司凭空造概念。2.1 第一次跃迁分库分表与分布式中间件最早的海量数据场景大家还是用MySQL。单表数据量过了千万、单库写入量过了每秒几千数据库就开始报警。于是有了分库分表把一张大表按某个字段比如用户ID散到多张表、多个库里。这阶段出了不少中间件像ShardingSphere、MyCat它们对外伪装成一个数据库对内负责路由、合并结果、管理分片规则。这套方案本质上还是行式存储只是把行散到多台机器。好处是能撑住更大数据量坏处也突出跨分片事务基本得靠业务自己处理分布式下的全局ID、跨节点Join、扩容重分布全是坑。我见过不少小团队被分库分表中间件的分布式事务问题折磨最后实在没办法才转向NoSQL或NewSQL。但无论如何这一步让行式存储第一次摆脱了单机容量约束。2.2 第二次跃迁LSM Tree让行式存储吃下写密集型场景HBase和Cassandra为代表的一批分布式行式数据库底层核心是LSM TreeLog-Structured Merge Tree。这个设计的革命性在于把“随机写”变成“顺序写”。LSM Tree的写入路径是这样的数据先追加到WAL日志再进入内存里的MemStoreMemStore攒到一定大小后一次性刷成不可变文件磁盘上不断产生小文件再由后台Compaction合并成大文件。整个过程没有昂贵的内存随机写、也没有磁盘随机写完美适配海量高并发写入。HBase虽然被归类为“面向列族”存储但按Rowkey读取一行数据依然非常高效——一个Rowkey在逻辑上就对应一行完整记录各列族数据通过Rowkey关联。这种模式下你可以把海量用户画像、订单流水、设备上报数据按用户ID或设备ID整行存放并支撑极高的并发点查。我第一次在一个每天几十亿条增量数据的项目里用HBase当时最大的感受是原来行式存储换个引擎形态吞吐能力能比MySQL高两个量级。2.3 第三次跃迁NewSQL与云原生重塑行式存储分库分表和HBase都没能完美解决一个矛盾既要分布式扩展又要强一致事务和SQL体验。于是TiDB、OceanBase、CockroachDB这些NewSQL数据库出现了。它们底层核心依然是行式存储引擎但用Raft协议做多副本一致性用MVCC实现分布式事务对外提供几乎和MySQL一致的协议。这轮变革里行式存储还完成了存算分离计算节点不管数据落盘存储层直接挂在分布式文件系统或对象存储上。云上扩容就像拧水龙头不再需要挪数据。更值得注意的是TiDB一类产品甚至把列式引擎如TiFlash作为分析加速组件挂进来让行式与列式在同一套系统里协同工作。这已经远超当年“一张表存哪里”的范畴成了真正的融合态。3. 大数据流水线里行式存储不可替代的高价值场景聊完演进回到实际业务。我总结了大几类场景只要你的系统命中其中任何一种请慎重考虑行式存储而不是无脑堆列式。3.1 高并发点查用户维表、实时风控、会员中心推荐系统、实时营销、风控引擎对“查用户最新画像”的要求都是毫秒级。这类请求长这样“给我用户ID为U_10293的全部画像信息”。它天然是KV语义如果存到HBase或TiDB里一个Rowkey直接定位存到Parquet数仓里你得扫一堆文件才能把分散在不同列块的数据拼回来。我做过一个用户标签服务底层从MySQL迁到HBase后单次查询延迟从平均8毫秒压到2毫秒以内吞吐翻了几乎一个量级。并不是MySQL不行而是行式存储选对形态、做好预分区之后的并发能力确实强。3.2 事务型核心数据订单状态、账户余额、库存扣减只要涉及钱、货、券就别想绕开行式存储。原因很简单业务要求ACID要求不能丢数据、不能超卖、要能回滚。列式文件格式提供不了这种精度。哪怕是在大数据数仓体系里ODS层的原始订单明细也大量存在HBase这类行式库里供在线业务回调、状态流转查询再由同步任务定期转成Parquet供离线分析。很多时候大家讨论的Lambda架构里实时链路的速度层就依赖行式存储。HBase保存的订单明细可以随时查最新状态离线数仓则负责T1的统计报表。二者各干各的天然互补。3.3 卫星遥感与时空轨迹按目标对象整行取数结合卫星遥感大数据的实际案例说。像基于TLE两行轨道数据的遥感卫星轨道动态可视化系统每颗卫星就是一行数据包含轨道六根数、时间戳、姿态参数、覆盖区域等字段。系统运行时要按照卫星编号实时查询某颗卫星的最新轨道参数做动态展示与覆盖分析。这就是典型的“一个目标一行、按目标更新”模式用行式存储存TLE数据再合适不过。换成列式存储每次查询都要把几十列数据按卫星ID重新拼装解析开销和IO浪费很大。所以这类时序但按对象归档的数据行式存储反而是更顺手的选择。3.4 图数据与关系网络点边属性频繁更新社交关系链、设备调用链、资金流转图这些图数据里的点和边都要记录大量动态属性。比如“这个IP最近一次活跃时间”、“这条设备关系链的信任分”。图数据库底层往往也用行式或KV方式存储点边数据因为图算法要频繁地按点ID取属性、更新边的权重。这个访问模式也远远偏离列式存储的主场。4. 行式存储选型落地HBase、分布式MySQL、KV怎么选才能不踩坑明确了“非用行式不可”接下来实际问题就是选型。我直接给一张决策表然后展开讲落地细节。4.1 选型决策对比选型优势劣势适用场景HBase海量写入、高并发点查、线性扩展二级索引弱、原生不支持SQL事务用户画像、日志流水、轨迹数据Cassandra多数据中心复制、写入线性扩展一致性模型复杂、运维门槛高IoT设备数据、跨地域多活TiDB / OceanBase强事务、兼容MySQL、行列混合资源占用高、部署较重核心交易、订单、账户、实时在线库Redis极快、数据结构丰富内存容量受限、持久化能力弱缓存层、热数据点查分库分表MySQL团队最熟、SQL生态成熟分布式事务难、扩展笨重数据量可控、不愿引入新组件的团队如果团队已经有运维MySQL的经验数据量刚开始增长我会建议先走分库分表一旦分片数量超过两位数、跨分片查询和分布式事务开始频繁出现再迁HBase或TiDB。HBase适合明确知道访问模式是KV点查、不依赖复杂二级索引的业务。TiDB则适合一开始就打算用SQL、需要强事务、但又有大数据量压力的在线业务。4.2 HBase生产环境的关键配置如果你决定用HBase以下配置是我在生产环境里验证过的基线值# 每个RegionServer的内存MemStore上限建议不超过堆内存的40% hbase.hregion.memstore.flush.size134217728 # BlockCache占比读多写少可调到45%写多读少降到30% hfile.block.cache.size0.4 # RegionServer处理RPC请求的线程数机器核数高可调到60 hbase.regionserver.handler.count30 # WAL文件大小太小会导致频繁滚动太大恢复耗时长 hbase.regionserver.hlog.blocksize268435456 # 开启布隆过滤器ROW类型就够用点查性能提升明显 hbase.hstore.blockingStoreFiles16配置之外更重要的是表设计。Rowkey不要直接用自增ID或纯时间戳否则写入会全部砸到少数Region上形成热点。常规做法是加盐哈希前缀或倒序时间戳。比如用户ID是U_109283可以取哈希后的前几位拼上原始ID让数据均匀分布到不同Region。4.3 行式存储与列式数仓的协同链路很多人以为引入HBase就要抛弃Hive数仓其实真实架构里两者是串联的。我现在的标准链路是这样业务MySQL / 消息队列(Canal消费binlog) - Kafka - HBase在线行式存储保存最新状态和明细 - 定时任务批读HBase - 转换为Parquet/ORC写入数据湖 - 供Hive/Spark离线分析实时链路从HBase点查离线链路从列式文件批量扫描。同一份数据在行式存储里以“记录可用”的价值存在在列式存储里以“分析可用”的价值存在。既满足了实时事务又保障了分析性能还顺带解决了列式存储最难搞的“更新问题”——因为更新发生在HBase列式层只做追加和批量覆盖分区。5. 性能调优实操让行式存储在大数据场景下不再“慢”很多开发者的刻板印象是行式存储“慢”。这个“慢”大多来自用错了查询方式、没有命中索引、没有做好缓存和压缩。这里分享几个真正有效的调优招数。5.1 点查提速布隆过滤器与二级索引HBase默认按Rowkey点查很快但如果你想按“身份证号”、“手机号”这类非Rowkey字段查就必须扫全表或设计二级索引。低成本的方案是为高频查询字段生成“索引Rowkey”比如存一条“手机号倒序 - 用户ID”的映射记录更省事的方案是引入Phoenix或把索引数据同步到Elasticsearch。布隆过滤器也不能漏。Row类型布隆过滤器可以在Region定位时提前排除那些“肯定不含目标Rowkey”的HFile减少实际读盘。对随机读为主、数据分散在大量HFile里的场景开启后点查性能提升非常明显。单条延迟能再降一半以上。5.2 缓存分层BlockCache、堆外内存与热点行行式存储的性能上限往往在内存命中率。HBase的BlockCache负责缓存热点Block默认LRU淘汰。读多写少的表可以把hfile.block.cache.size调到0.45让更多热点Block留在内存里。更进一步可以开堆外内存OffHeap缓存避免频繁GC带来的延迟毛刺。另外如果业务存在极热行比如几个头部主播的实时数据建议在服务层再做一层本地缓存比如Caffeine或Redis别让几十万QPS的点查全打到HBase上。缓存这一层不是为了省机器是为了让尾部延迟更稳。5.3 压缩算法选型不是无脑选Snappy行式存储的压缩确实比列式吃亏但依然有选择余地。HBase的HFile支持多种压缩算法我实际测下来压缩算法压缩率CPU消耗适用场景Snappy中等低默认选择吞吐优先LZO略高于Snappy低老集群兼容新版不推荐Zstd高中等冷数据、IO瓶颈明显时强烈推荐Gzip最高高归档数据不常访问LZ4较低极低追求极致写入吞吐如果磁盘IO是瓶颈Zstd是很好的折中方案。压缩率比Snappy高30%以上解压速度却依然可观。对日志型数据我基本无脑Zstd。对高吞吐在线读写Snappy仍然是稳妥选择。关键是要做基线测试不要看网上说哪个好就直接上。5.4 Compaction与MemStore刷写节奏Compaction是HBase里最容易引起雪崩的隐形杀手。Major Compaction会把一个Region的所有HFile合并成一个大文件IO和CPU开销巨大如果所有Region在同一时间触发直接拖垮整个集群。生产环境我一般这样处理把hbase.hregion.majorcompaction设成0关闭自动Major Compaction然后写脚本在每天业务低峰期手动跑。MemStore刷写阈值和BlockCache配比也要一起调。写多读少时把MemStore占比调高让数据在内存里多聚一会儿再刷盘减少HFile数量读多写少时把BlockCache占比调高。没有万能参数只有根据请求模型做针对性调整。6. 给正在入门大数据的你行式存储相关的学习路线与面试切入点每次写技术文章总会有读者问“我该怎么学”。这章专门送给正在做大数据毕设、准备大数据面试、以及刚转行大数据开发的人。6.1 推荐的四步学习路线第一步吃透传统关系型数据库原理。把MySQL InnoDB的BTree、事务隔离级别、redo/undo日志搞明白。这是整个行式存储的知识底座没有这一层后面学HBase、TiDB都是空中楼阁。第二步上手Hadoop生态和离线数仓。掌握HDFS文件系统知道SequenceFile、RCFile、ORC、Parquet这些文件格式的差别尤其是为什么ORC/Parquet是列式、适合分析场景。这阶段可以跑通一个Hive数仓Demo亲手验证点查和聚合在不同格式上的性能差异。第三步深入HBase或者RocksDB的存储引擎。理解LSM Tree、MemStore、WAL、Compaction、BloomFilter这些核心概念。如果能自己写出一个迷你LSM存储引擎对原理的理解会完全不一样。第四步进阶NewSQL与云原生数据库。看TiDB的架构文档理解Raft、MVCC、存算分离、行列混合引擎。到这个阶段你已经能把行式存储的历史、现在和未来串成一条线。6.2 面试中被问“行式 vs 列式”怎么答出深度面试官问行式存储和列式存储区别如果你只背“行式适合点查列式适合分析”那基本没戏。建议按这个层次答先答本质差异行式按行连续存储、列式按列连续存储直接导致IO模型和压缩率不同。再答引擎形态MySQL/HBase/TiDB是行式或行式为主Parquet/ORC是列式。然后展开HBase的LSM Tree和TiDB的行列混合把分布式、事务、存算分离这些点带出来。最后落到业务选型在线交易和实时点查用行式离线聚合和统计分析用列式现代架构用同步链路打通两者。这样答既有原理又有实践深度。还有一个高频变种题“HBase为什么查询快”很多人都答“因为HBase基于LSM Tree”。这其实不严谨LSM Tree的优势在写入。HBase点查快的关键是Rowkey索引加BlockCache加BloomFilter查询能快速定位到具体HFile和Block。写入快靠顺序写内存读取快靠索引、缓存和过滤这两条腿要分清。6.3 毕设和练习项目方向如果你在选大数据毕业论文选题或者课程设计方向以下几个思路可以直接参考。基于HBase的实时用户画像系统用Flume或Canal接入日志数据Kafka做缓冲HBase存画像标签对外提供点查API。前端可以配一个简单的数据展示页面部分场景叠加图表展示能力。基于HBase的卫星TLE轨道数据存储与可视化系统抓取公共TLE数据集卫星ID做Rowkey按时间版本存储轨道参数后台任务定期更新前台提供轨道路径查询和可视化。这个方向同时踩中了“卫星遥感大数据”和“空间数据管理”两个热门词选题价值和创新性都不错。基于分布式行式数据库的订单中心模拟用TiDB做订单和库存表模拟高并发下单和库存扣减再通过同步导出到Hive数仓做销量统计。这个项目既能展示行式存储的事务能力也能展示数据链路整合能力。我个人在实际项目里还有一个很深的体会行式存储的优化空间中最容易出效果的是Rowkey/主键设计最容易忽略的也是它。设计表之前想清楚“未来的查询到底长什么样”比事后加缓存、加索引不知道高效多少倍。行式存储从MySQL时代一路走到云原生今天底层原则始终没变——只有访问模式匹配存储模型性能才是水到渠成的事。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价