Spark Word Count 与 MapReduce Word Count 对比表格汇总

1. 核心技术原理对比表

对比维度Spark Word Count(文档实验方案)MapReduce Word Count
核心数据结构基于RDD(弹性分布式数据集) ,支持内存存储与多次复用,是分布式计算的核心抽象基于键值对(Key-Value) ,依赖磁盘存储,中间结果仅单次使用且必须写入磁盘
计算模型DAG(有向无环图)模型:将词频统计拆分为 “读取→分词→映射→聚合→排序→输出” 的算子链,支持执行计划优化两阶段模型(Map→Shuffle→Reduce):严格按 “Map 处理→Shuffle 传输→Reduce 聚合” 顺序执行,无灵活优化空间
执行触发机制惰性执行:转换算子(如 flatMap、map)仅定义逻辑,需动作算子(如 collect、saveAsTextFile)触发实际计算立即执行:Map 任务完成后立即触发 Shuffle,Shuffle 结束后自动启动 Reduce 任务,无逻辑与计算分离设计

2. 执行流程与资源消耗对比表

对比维度Spark Word Count(文档实验方案)MapReduce Word Count
数据读取环节通过sc.textFile()读取 HDFS 文件,直接加载为 RDD,支持从内存缓存(可选persist()通过 InputFormat 读取 HDFS 分片(Split),将数据转换为键值对后传入 Map 函数,无内存缓存机制
中间计算环节分词(flatMap)、映射(map)、聚合(reduceByKey)均在内存中执行,仅需最终输出写入 HDFS分词与映射(Map 阶段)结果先写入内存缓冲区,满后溢写本地磁盘;聚合前需从磁盘读取 Shuffle 数据
Shuffle 机制支持预聚合优化(如reduceByKey先在分区内局部聚合,再全局聚合),减少跨节点数据传输量无预聚合,Map 输出直接按 Key 分区并溢写磁盘,Reduce 需拉取所有对应分区数据,传输量较大
结果输出环节支持双输出(文档中collect()控制台打印 +saveAsTextFile()写入 HDFS),输出前数据仍在内存中仅支持写入 HDFS,Reduce 计算完成后直接将结果输出到指定路径,无控制台快速验证能力
资源释放方式需显式调用sc.stop()关闭 SparkContext,释放 Driver 与 Executor 资源(文档实验中关键步骤)任务完成后自动释放 YARN Container 资源,无需手动关闭上下文

3. 性能表现对比表

对比维度Spark Word Count(文档实验方案)MapReduce Word Count
磁盘 IO 频率低:仅数据读取(HDFS→内存)和最终输出(内存→HDFS)需磁盘 IO,中间计算无磁盘操作高:Map 输出溢写磁盘、Shuffle 拉取磁盘数据、Reduce 合并写入磁盘,全程多次磁盘 IO
跨节点数据传输量小:reduceByKey预聚合减少 Shuffle 数据量,文档中 3 节点集群下传输量仅为原始键值对的 1/3~1/2大:无预聚合,需传输所有 Map 输出的键值对,数据量等于 Map 阶段输出总量
任务启动速度较快:Spark 集群启动后(文档中start-all.sh),Driver 与 Executor 可复用,后续任务无需重新初始化资源较慢:每次任务需重新申请 YARN Container,初始化 Map/Reduce 进程,启动耗时较长
小数据场景表现高效:文档中测试文本(92B)可秒级完成计算,控制台快速打印结果(collect()低效:小数据量下仍需完整执行 Map→Shuffle→Reduce 流程,磁盘 IO 开销占比高,耗时较长

4. 开发与运维对比表

对比维度Spark Word Count(文档实验方案)MapReduce Word Count
开发语言支持支持 Scala(文档中使用)、Java、Python 等,Scala 代码更简洁(如算子链式调用)主要支持 Java,也可通过 Hadoop Streaming 支持 Python,但代码冗余度高(需实现 Map/Reduce 类)
项目构建工具依赖 Maven(文档中 3.6.3),需配置 Scala 编译插件(scala-maven-plugin)和打包插件(maven-shade-plugin可使用 Maven 或 Ant,配置简单,无需额外编译插件(仅需引入 Hadoop 核心依赖)
集群部署与验证需验证 Spark 集群进程(文档中jps查看 Master/Worker)+ HDFS 服务(hdfs dfs -ls/touchz仅需验证 Hadoop 集群进程(NameNode/DataNode/ResourceManager),部署依赖更少
问题排查难度需查看 Spark 日志(文档中/opt/module/spark-3.3.0/logs)+ Driver/Executor 日志,支持 Web UI(4040 端口)主要查看 YARN 日志(yarn logs -applicationId),日志分散,排查效率较低
版本兼容性要求严格:Scala 版本需与 Spark 匹配(如 Spark 3.3.0 对应 Scala 2.12.x),Maven 需 3.3.9+(文档中升级解决兼容性问题)宽松:仅需匹配 Hadoop 与 JDK 版本,无其他语言版本强依赖,低版本 Maven(如 3.0.5)也可使用

5. 容错与扩展性对比表

对比维度Spark Word Count(文档实验方案)MapReduce Word Count
容错机制基于 RDD lineage(依赖链):某节点故障时,可通过父 RDD 重新计算丢失数据,无需全量重跑基于磁盘 checkpoint:Map/Reduce 任务失败后,需从上次 checkpoint 或重新执行完整阶段
节点故障恢复速度快:仅重新计算丢失的 RDD 分区,文档中 3 节点集群下单个 Worker 故障不影响整体任务慢:Map 任务失败需重新执行该任务及后续依赖的 Reduce 任务,Shuffle 数据需重新传输
横向扩展能力强:新增 Worker 节点后,Spark 自动发现并分配任务,文档中 3 节点集群可轻松扩展至更多节点较强:支持新增 DataNode/NodeManager,但任务分配依赖 YARN 调度,扩展后性能提升幅度低于 Spark
多任务并发支持支持:Spark 集群可同时运行多个 Word Count 任务,共享 Executor 资源(通过资源队列控制)较弱:多个任务需竞争 YARN Container 资源,任务间隔离性强但资源利用率低

更多推荐