dream

一个菜鸟程序员的成长历程

0%

为什么分布式计算框架都逃不出MapReduce的“影子”?3个进化方向你必须看懂

大家好,我是大头,职高毕业,现在大厂资深开发,前上市公司架构师,管理过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
2
3
4
5
val rdd = sc.textFile("hdfs://...")
.flatMap(_.split(" "))
.map((_, 1))
.reduceByKey(_ + _)
.cache() // 内存缓存!

下面这几点就是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——真正的实时流处理

如果说SparkMapReduce都是离线数据处理的话,那么Storm就可以实现实时数据处理了。

它采用Spout-Bolt拓扑结构,实现毫秒级延迟的数据处理:

Topology就是一张有向图,把Spout和Bolt连起来,每条消息像水一样流过去。

1
2
3
4
5
6
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout("sentences", new RandomSentenceSpout(), 5);
builder.setBolt("split", new SplitSentence(), 8)
.shuffleGrouping("sentences");
builder.setBolt("count", new WordCount(), 12)
.fieldsGrouping("split", new Fields("word"));

革命性特性:

  • 毫秒级延迟,消息来了立刻处理,不用等下一轮批量触发。
  • 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
2
3
4
5
DataStream stream = env.socketTextStream("localhost", 9999);
stream.flatMap(new Splitter())
.keyBy(0)
.window(TumblingProcessingTimeWindows.of(Time.seconds(5)))
.sum(1);

技术突破点:

  • Dataflow模型实现Google论文思路,比传统DAG更灵活;
  • 检查点机制保证高可用;
  • 自适应反压机制防止下游堵塞崩溃;
  • 不过Flink学习曲线是真的陡,新人入坑容易爬不出来…

技术谱系&现代架构长啥样?

说个真实例子,我们曾经在广告点击日志处理中,从Hadoop迁移到Spark后,单次ETL耗时从6小时降到40分钟;而在用户行为实时推荐上,用Storm实现后端流水线,把延迟从10秒降到了500毫秒。

下面使用Mermaid画一个流程图,来看一下从MapReduce一直到Flink的技术进化史,感受一下技术的日新月异,也不要忘了致敬经典,吃水不忘挖井人:

1
2
3
4
5
6
7
graph TD
A[MapReduce] --> B[Hadoop生态]
A --> C[Spark]
A --> D[Storm]
C --> E[Spark Streaming]
D --> F[Flink]
F --> G[流批一体化]

深度思考:“湖仓一体”和云原生才是终极形态?

回头看这些年大数据平台的发展,有几个趋势特别明显:

  • 共性特征
    • 计算与存储彻底解耦
    • Spark/Flink负责算力调度;HDFS/S3/Delta Lake负责海量存储;YARN/K8s负责资源管理。
  • 全面云原生化
    • Docker容器部署,大规模弹性伸缩变得容易;微服务架构让各模块独立升级维护不再痛苦。
  • 湖仓一体融合
    • 数据湖保存原始明细,仓库负责结构化分析,两者通过统一接口协作,实现离线+实时混合查询能力。

总结

最后,总结一下这几个框架的优缺点:

框架 优势 劣势
Spark 批量分析快、生态丰富 真正实时差、吃内存多
Storm 毫秒级响应、运维简单 状态弱、生态单一
Flink 流批统一、一致性强 学习曲线陡峭

根据这些优缺点,可以根据具体业务的需要来进行选择,如果只是需要离线数据运算的话,可以选择Spark,如果是要进行实时数据的话,可以选择Storm或者Flink。

如果有对具体框架感兴趣的可以进行留言,我会深挖框架的源码,并出一个从0-1设计实现的文章。

文末福利

关注我发送“MySQL知识图谱”领取完整的MySQL学习路线。
发送“电子书”即可领取价值上千的电子书资源。
发送“大厂内推”即可获取京东、美团等大厂内推信息,祝你获得高薪职位。
发送“AI”即可领取AI学习资料。
部分电子书如图所示。

概念学习

概念学习

概念学习

概念学习