上一篇说到"Hive 和 Doris 的'成本模型完全不同'",有小伙伴私信我问"Doris 比Hive 能贵多少?",emmm 怎么说呢,这个"成本"不单单是在比谁便宜,更全面一点的理解是:它们花钱的方式和驱动因素根本是两套逻辑。
举个例子,你说说"集装箱船"和"闪送骑手"都能运货是吧?但他们的成本模型完全不同------前者烧柴油按航次摊薄,后者烧人力按单计费,你用评估船的方式去估骑手,那显然是不合适的对吧》~
下面我们再算的详细点儿~
先把"成本"拆成三笔账
真正在公司里跑,总成本 = 存储成本 + 计算成本 + 隐性成本(运维/稳定性/人力)
|-------|---------------------------------------------|-------------------------------------------|
| | Hive | Doris |
| 存储付给谁 | HDFS / S3 / OSS 对象存储(按容量计费,盘可以慢、可以高密度) | BE 节点的本地盘(通常更快的 NVMe/SSD,绑定在机器上,利用率低就白花钱) |
| 计算怎么跑 | 弹性:YARN / K8s 提交一个 Spark 任务 → 拉起一批容器 → 跑完释放 | 常驻:FE/BE 进程 24×7 占着内存和 CPU,哪怕没人查也得留着 |
| 隐性成本 | 批处理任务失败可重试,慢一点大家接受(凌晨跑的嘛) | 查询卡了运营会打电话,并发上来 OOM 就影响所有人 |
这三条每一条都导致两边"同一个动作花的钱"不是一个量级的。
① 存储成本:存 1TB 在 Hive 和存 1TB 在 Doris,价格差在哪?
Hive 的存储本质 = 文件。
数据写成 Parquet/ORC 放在 HDFS 或对象存储上:
-
用高密度机械盘也行(HDFS 3副本但可用纠删码压到1.5倍空间)
-
放 S3/OSS 的话连机器都不用管,纯按 GB/月计费
-
文件是不可变的------写完就放那儿,不需要"实时维护索引结构"
所以 Hive 的存储成本曲线非常平:
1TB 历史数据放三年 = 3TB×年费,几乎没有额外开销,它只是静静躺在路径里。
Doris 的存储本质 = 数据库页 + 索引 + 副本 + 物化视图维护。
Doris 存的不是裸文件,它要维护:
-
数据按 Tablet 分片分布(默认 3 副本)
-
前缀索引 / Bloom Filter / Zone Map 这些结构跟着写
-
压缩后仍然比 Parquet 的极致压缩比略吃亏(因为它要为随机读取优化布局)
-
最重要的是:数据存在 BE 的本地盘上,这些盘属于"昂贵的 compute 节点的一部分"
所以 Doris 的存储成本曲线是阶梯状的:
你加 1TB 数据 ≠ 只加 1TB 盘费,它意味着更大的 BE 节点 / 更多节点 / 更多副本内存开销 / 更长的 compaction 链 ------ 牵一发动全身。
直觉理解:Hive 像把东西码在仓库货架(便宜/慢取),Doris 像把东西摆在前台展柜里(贵/随手拿)。你不会把三年前的发票全摆进展柜。
② 计算成本:批处理摊薄 vs 常驻占座
这是最容易被忽略但杀伤力最大的一项。
Hive(其实是 Spark SQL on Hive)的计算模型:
提交任务 → 申请资源(executor × N核 × M内存)→ 跑 → 释放
-
资源是借来的,跑完还回去
-
可以设置队列优先级、动态分配(idle executor 自动缩容)
-
夜间批处理窗口可以开大,白天缩回去给 adhoc 留空间
-
你为"跑的那几个小时"付费(云上就是 Spot/弹性实例,巨便宜)
所以一个典型场景:
每天重算昨天 200 亿行日志 → 用 400 核跑 45 分钟 → 按使用量算钱,用完不占着
Doris 的计算模型:
FE/BE 进程 24×7 RUNNING 内存里缓存元数据/索引/热数据页 查询来了 → 马上分配 pipeline 线程 → 结果要在 2 秒内出来
-
你得永远留足 headroom(比如内存用到 70% 就得扩容,不能跑到 95%)
-
没人查的时候,那些内存和 CPU 仍然是被占着的(进程活着、cache 热着)
-
并发一上来不是"多拉几台容器"那么简单,是整个集群的规划问题
所以同一个事实------"我有数据要处理"------两种成本驱动:
|--------|----------------------|-------------------------------------|
| | Hive/Spark | Doris |
| 成本驱动因子 | 数据量 × 处理次数(跑一次算一次的钱) | 数据量 × 留存天数 × 并发峰值(节点规模定下来,每天睁眼就在计费) |
| 扩缩容 | 弹性,甚至队列排队也行 | 加节点要迁移 tablet,缩节点更麻烦 |
| 适合负载 | 吞吐量优先(扫全表不在乎) | 延迟优先(随机读/点查/JOIN 要快) |
直觉理解:Hive 像租车按天/按时计费跑运输,Doris 像租了个固定店面------开门就交房租,不管今天有没有客人。
③ 隐性成本:Hive 慢是"可接受的慢",Doris 慢是"事故"
这个一般人不会写进 PPT 但决定真实 ROI:
-
Hive 链路延迟:凌晨 2 点到 6 点跑完就行,晚 20 分钟没人察觉 → 所以可以用更便宜的资源配置混过去
-
Doris 查询延迟 :运营 9 点上班点开看板,3 秒没出来就开始催 → 所以你必须预留冗余容量、监控内存/合并/分区倾斜,这些都是持续的人力运维成本
换句话说:
Hive 的成本是线性可预测的(多一倍数据≈多一倍跑的时间≈按比例加核)
Doris 的成本是非线性跳跃的(数据量过了某个拐点→要新节点→要调分桶→要拆表→要专人盯)
一个具体数字感(量级,不是精确报价)
假设同样是 10TB 可查询数据:
|------------|------------------------|--------------------------|
| | Hive(存 S3 + Spark 按需算) | Doris(3副本 BE集群) |
| 存储月费 | ~几百元(对象存储价格) | ~数千元(SSD节点绑定的容量溢价 + 副本) |
| 计算 | 只在需要时付费(夜间批处理) | 常驻进程 24×7 |
| "让查询变快"的做法 | ❌ 做不到 | ✅ 但它的代价就是上面的存储+常驻开销 |
所以结论不是"Doris 贵所以不好"------它贵是因为它在卖你不用的那 16 个小时里也保持就绪的能力。你只为需要这种能力的部分买单,其他地方别买。
所以"成本模型完全不同"翻译成人话就是:
Hive 把成本绑在"数据规模和加工次数"上(用多少付多少,跑完放手),Doris 把成本绑在"服务等级和留存体量"上(为了随时能答,必须一直占着资源)。
这就是为什么架构上正确的姿势永远是:
Hive 存全部 + 加工全部,Doris 只承载其中需要被快速消费的那一小部分。