大家好,我是大头,职高毕业,现在大厂资深开发,前上市公司架构师,管理过10人团队!
我将持续分享成体系的知识以及我自身的转码经验、面试经验、架构技术分享、AI技术分享等!
愿景是带领更多人完成破局、打破信息差!我自身知道走到现在是如何艰难,因此让以后的人少走弯路!
无论你是统本CS专业出身、专科出身、还是我和一样职高毕业等。都可以跟着我学习,一起成长!一起涨工资挣钱!
关注我一起挣大钱!文末有惊喜哦!
关注我发送“MySQL知识图谱”领取完整的MySQL学习路线。
发送“电子书”即可领取价值上千的电子书资源。
发送“大厂内推”即可获取京东、美团等大厂内推信息,祝你获得高薪职位。
发送“AI”即可领取AI学习资料。
为什么分布式计算框架都逃不出MapReduce的“影子”?3个进化方向你必须看懂
之前,我们已经从0-1设计并实现过一个基于Golang的MapReduce系统了,当然,我们实现的系统还有一些缺陷,今天,我们就来看一下这些开源的基于MapReduce升级版的系统。他们的设计思想,优化点是哪些。
凌晨3点,数据平台报警:某金融风控模型训练任务卡死,团队一边排查Hadoop集群,一边感叹——“怎么还是老掉牙的MapReduce?”
其实,不管是Spark、Storm还是Flink,你会发现它们的底层设计都绕不开MapReduce。但为什么这些新框架还要不断“改造”前辈?到底有哪些局限被突破,又有哪些坑依然存在?这篇文章,我就带你拆解分布式计算框架的技术谱系和演进逻辑。
问题的本质:MapReduce到底解决了什么,又卡在哪儿?
首先,我们需要明白MapReduce为什么是基石,它凭什么坚定了以后的分布式计算的基础。因为它把分布式计算最难啃的几块骨头——编程抽象、容错机制、数据本地性、自动并行化——都做到了极致:
- 编程抽象:只需写好map和reduce两个函数,剩下复杂度全交给系统。
- 容错机制:任务级别自动重试,不怕节点挂掉。
- 数据本地性:让计算主动靠近数据,减少网络传输。
- 自动并行化:开发者不用关心分片、调度等细节。
但用过的人都知道,这套模式也有硬伤,毕竟是04年发表的论文,到现在已经过去很久了,技术的日新月异,导致当时看来很厉害的技术,现在已经过时了:
- 磁盘I/O瓶颈:每轮任务都要落盘,中间结果反复读写磁盘,性能拉胯。
- 批处理导向:只能做离线大批量处理,对实时/流式场景无能为力。
- 编程灵活性差:只有两种操作(map/reduce),复杂逻辑很难表达。
- 迭代效率低下:比如机器学习算法,每次迭代都得重新读写磁盘,非常慢。
说实话,这些痛点直接催生了后续所有主流分布式计算框架。
有次我们广告CTR模型训练,用MapReduce跑了一晚上还没动静,同事直接开喷:“这TM也太慢了吧!”
技术方案解析
Apache Spark——内存计算革命
Spark就是主要解决了MapReduce中的磁盘IO问题,因为MapReduce每次都是写入和读取磁盘,我们知道,磁盘的速度是远远低于内存的。
Spark的核心创新就是RDD弹性分布式数据集,可以.cache()到内存,再也不用反复读写HDFS。
1 | val rdd = sc.textFile("hdfs://...") |
下面这几点就是Spark解决掉的MapReduce的一些痛点问题,也是Spark的优势,当我们要做一些技术选型的时候,我们可以根据这些来判断我们是否要使用Spark。
- 内存计算:RDD可以缓存中间结果到内存,大幅减少磁盘I/O。
- DAG执行引擎:支持任意复杂的数据流图,不再受限于两阶段模型。
- 多语言支持:Scala、Java、Python、R全覆盖。
- 统一生态圈:SQL分析(Spark SQL)、机器学习(MLlib)、图计算(GraphX)、流处理(Streaming)一网打尽。
做过一些测试,测试数据如下:
- MR版耗时2小时,全程CPU不到30%,I/O飙90%
- Spark版18分钟搞定,CPU利用率70%,I/O只有20%
老板看到报表直接说:“以后这种活都用Spark整。”
下表是一些对比,简单明了。
| 特性 | MapReduce | Spark |
|---|---|---|
| 计算模型 | 两阶段 | DAG随便整 |
| 数据存储 | 磁盘 | 内存+磁盘 |
| 迭代性能 | 菜鸡 | 牛逼 |
| 实时性 | 批处理 | 准实时微批 |
虽说Spark解决了磁盘IO的问题,但是我们要明白,内存虽然速度快,但是。。。它贵啊,一般来说内存都是比较小的,因此我们要谨慎使用内存,不要光顾着快了。持久才是王道。
Apache Storm——真正的实时流处理
如果说Spark和MapReduce都是离线数据处理的话,那么Storm就可以实现实时数据处理了。
它采用Spout-Bolt拓扑结构,实现毫秒级延迟的数据处理:
Topology就是一张有向图,把Spout和Bolt连起来,每条消息像水一样流过去。
1 | TopologyBuilder builder = new TopologyBuilder(); |
革命性特性:
- 毫秒级延迟,消息来了立刻处理,不用等下一轮批量触发。
- Spout-Bolt拓扑结构,自由组合各种算子,比MR灵活太多。
- At-least-once语义,有丢包自动重试,不怕漏数。
- Worker/Supervisor故障自恢复,上次生产环境挂了一台机器,都没人发现。
应用场景举例:
- 系统指标监控报警
- 用户行为推荐
- 金融交易风控
但Storm同样也有一些缺点,比如:状态管理不行
Apache Flink——流批一体化新范式
其实,我们仔细看就会发现,Spark解决了磁盘IO的问题,Storm实现了从离线数据计算到实时计算的跨越,而Flink解决了Storm状态管理的问题。
对于Flink来说,同一个API既能跑离线批处理,也能搞实时流分析:
Flink具有以下核心优势,这些优势是Flink不同于其他几个框架的最大的竞争力:
- 同一个API同时搞定批处理和流处理,不用切换框架脑壳疼。
事件时间+Watermark,对乱序数据友好得很。(之前Storm遇到乱序就懵逼)- 精确一次语义(Exactly-once),金融场景必备,再也不怕账算错了被罚钱。
状态管理强大,有分布式状态后端,还能快照恢复。
一些简单的代码示例
1 | DataStream stream = env.socketTextStream("localhost", 9999); |
技术突破点:
- Dataflow模型实现Google论文思路,比传统DAG更灵活;
- 检查点机制保证高可用;
- 自适应反压机制防止下游堵塞崩溃;
- 不过Flink学习曲线是真的陡,新人入坑容易爬不出来…
技术谱系&现代架构长啥样?
说个真实例子,我们曾经在广告点击日志处理中,从Hadoop迁移到Spark后,单次ETL耗时从6小时降到40分钟;而在用户行为实时推荐上,用Storm实现后端流水线,把延迟从10秒降到了500毫秒。
下面使用Mermaid画一个流程图,来看一下从MapReduce一直到Flink的技术进化史,感受一下技术的日新月异,也不要忘了致敬经典,吃水不忘挖井人:
1 | graph TD |
深度思考:“湖仓一体”和云原生才是终极形态?
回头看这些年大数据平台的发展,有几个趋势特别明显:
- 共性特征
- 计算与存储彻底解耦
- Spark/Flink负责算力调度;HDFS/S3/Delta Lake负责海量存储;YARN/K8s负责资源管理。
- 全面云原生化
- Docker容器部署,大规模弹性伸缩变得容易;微服务架构让各模块独立升级维护不再痛苦。
- 湖仓一体融合
- 数据湖保存原始明细,仓库负责结构化分析,两者通过统一接口协作,实现离线+实时混合查询能力。
总结
最后,总结一下这几个框架的优缺点:
| 框架 | 优势 | 劣势 |
|---|---|---|
| Spark | 批量分析快、生态丰富 | 真正实时差、吃内存多 |
| Storm | 毫秒级响应、运维简单 | 状态弱、生态单一 |
| Flink | 流批统一、一致性强 | 学习曲线陡峭 |
根据这些优缺点,可以根据具体业务的需要来进行选择,如果只是需要离线数据运算的话,可以选择Spark,如果是要进行实时数据的话,可以选择Storm或者Flink。
如果有对具体框架感兴趣的可以进行留言,我会深挖框架的源码,并出一个从0-1设计实现的文章。
文末福利
关注我发送“MySQL知识图谱”领取完整的MySQL学习路线。
发送“电子书”即可领取价值上千的电子书资源。
发送“大厂内推”即可获取京东、美团等大厂内推信息,祝你获得高薪职位。
发送“AI”即可领取AI学习资料。
部分电子书如图所示。



