【大数据系列】数据怎么分片?——HDFS Block vs Doris Tablet

HDFS BlockDoris Tablet 都是"把大数据切成小块",但切的逻辑完全不同。


一句话区别

HDFS Block 是"按斤切肉",不管肉是谁的,每块固定 128MB;

Doris Tablet 是"按户分粮",按家庭(分区)和人数(分桶)来分,一块就是一个完整的"小表"。


HDFS Block:按文件大小硬切

怎么切的?

你有一个 1GB 的文件,HDFS 说:"我不管这文件是什么内容,每 128MB 切一刀"。

1GB 文件 → 切成 8 块,每块 128MB Block-1: 文件的前 128MB(可能是 0~100万行) Block-2: 文件的 128MB~256MB(可能是 100万~200万行) ...

特点

  • 块大小固定(默认 128MB 或 256MB)

  • 块里没有业务含义,只是物理上的"一段字节"

  • 块里没有索引,查询时要扫描整个块

形象比喻:印刷厂切纸

出版社印了一本书,印刷厂不管章节内容,每 100 页切一刀

  • 第一刀:第 1~100 页

  • 第二刀:第 101~200 页

  • 第三刀:第 201~300 页

    问题:你要查"第三章在讲什么",可能第三章正好跨在第 100 页和第 101 页之间,你得把两块都拿来看。


Doris Tablet:按业务逻辑分

怎么切的?

Doris 说:"我不按文件大小切,我按数据逻辑切"。

比如你的订单表有 10 亿条数据,按时间分区 (每天一个分区)+ 哈希分桶(按 user_id 取模分 16 桶):

2024-01-01 的数据 → 分成 16 个 Tablet Tablet-1: user_id 模16=0 的订单 Tablet-2: user_id 模16=1 的订单 ... Tablet-16: user_id 模16=15 的订单 2024-01-02 的数据 → 再分成 16 个 Tablet ...

特点

  • 每块 Tablet 是一个完整的、独立的小表,有自己的 schema、索引、统计信息

  • 大小不固定,通常几百 MB 到 1GB

  • 查询时可以精准定位:"查 user_id=123 的数据?直接去 Tablet-11,别的 Tablet 不用看"

形象比喻:图书馆按主题分书架

图书馆有 100 万本书,不是按"每 100 本一堆"随便堆,而是:

  • 楼层 分:1 楼文学、2 楼科技、3 楼历史(这就是分区

  • 书架 分:科技楼里,A 架计算机、B 架生物、C 架物理(这就是分桶

  • 你要找《Java 编程》,直接去 2 楼 A 架,别的书架根本不用看。


核心差异对比

|-----------|------------------|---------------------|
| | HDFS Block | Doris Tablet |
| 切法 | 按文件大小硬切(128MB/块) | 按业务逻辑切(分区+分桶) |
| 里面是什么 | 一段无意义的字节 | 一个带索引、带统计的"小表" |
| 查询时 | 可能扫整个文件,不知道数据在哪 | 精准定位到某个 Tablet,别的跳过 |
| 副本 | 存 3 份同样的字节块 | 存多份,每份都能独立参与计算 |
| 适合 | 纯存储大文件(日志、视频、备份) | 实时分析(带条件的查询、聚合) |


为什么这个区别很重要?

HDFS Block 的问题

假设你要查:"2024 年 1 月 1 日,用户 123 的订单金额"。

HDFS 里:

  • 数据存在某个 128MB 的 Block 里

  • 但 HDFS 不知道"用户 123"在哪,甚至不知道哪些 Block 里有 2024-01-01 的数据

  • 只能把相关文件的所有 Block 都读一遍,全表扫描

Doris Tablet 的优势

Doris 里:

  • 先找分区:2024-01-01 的数据只在某些 Tablet 里 → 跳过其他 364 天的数据

  • 再找分桶:user_id=123 只落在某个特定 Tablet 里 → 跳过其他 15 个桶

  • 最后在这个 Tablet 里用索引快速定位到具体行

可能从 10 亿条数据里,只读了几千条就找到结果。


一句话记忆版

HDFS Block 是"物理切块",只知道"这是文件的第几段";Doris Tablet 是"逻辑分片",自带索引和边界,知道"这里存的是哪天的、哪个用户的数据"。

前者是存储系统 的分块方式,后者是数据库的分片方式 >> 目的不同,设计自然不同。