什么是DAG,为何Spark依靠DAG实现了大数据霸主地位
创作时间:
作者:
@小白创作中心
什么是DAG,为何Spark依靠DAG实现了大数据霸主地位
引用
CSDN
1.
https://blog.csdn.net/m0_73889530/article/details/145671432
DAG(Directed Acyclic Graph,有向无环图)是Spark等大数据处理框架的核心概念。本文将从数学定义、Spark中的实现、优化原理、容错机制等多个维度,深入解析DAG的重要性和应用价值。
1. 数学定义与特性
图论基础
- 有向性:边(Edge)具有方向(如A→B)
- 无环性:不存在循环路径(如A→B→C→A)
- 拓扑排序:所有顶点排成线性序列,满足前驱关系
关键性质
- 顶点数V,边数E满足:E ≤ V(V-1)/2
- 至少存在一个入度为0的顶点(起点)
- 至少存在一个出度为0的顶点(终点)
2. 在Spark中的实现
DAG生成流程
(Scheduler是调度程序)
Stage划分规则
依赖类型 | 示例操作 | Stage划分影响 |
---|---|---|
窄依赖 | map, filter | 合并到同一Stage |
宽依赖 | reduceByKey | 触发新Stage划分 |
示例:WordCount的DAG结构
val text = sc.textFile("hdfs://data") // Stage0
val words = text.flatMap(_.split(" ")) // Stage0
val pairs = words.map((_, 1)) // Stage0
val counts = pairs.reduceByKey(_ + _) // Stage1(宽依赖)
counts.saveAsTextFile("hdfs://output") // Stage1
3. 优化原理与优势
对比MapReduce模型
特性 | MapReduce模型 | Spark DAG模型 |
---|---|---|
任务调度 | 多阶段独立调度 | 全局优化调度 |
中间数据存储 | 必须写磁盘 | 内存优先 |
执行效率 | 高延迟(秒级) | 低延迟(毫秒级) |
复杂算法支持 | 迭代计算效率低 | 适合迭代和交互式查询 |
优化技术
- 流水线执行(Pipelining):
合并连续的窄依赖操作,避免中间结果落盘
- 任务合并:
// 优化前:两个Stage
rdd.map(f1).groupByKey().map(f2)
// 优化后:合并操作
rdd.map(record => f2(f1(record)))
- 数据本地化调度:
- 优先将Task调度到数据所在节点
- 本地化级别:PROCESS_LOCAL → NODE_LOCAL → RACK_LOCAL → ANY
4. 容错机制
血统(Lineage)恢复
val rdd = sc.textFile("hdfs://data")
.map(parse) // Lineage记录1
.filter(_.isValid) // Lineage记录2
.cache()
* 丢失分区时,根据血统重新计算
* 通过`checkpoint()`切断过长血统链
Checkpoint机制
spark.sparkContext.setCheckpointDir("hdfs://checkpoint")
rdd.checkpoint()
* 将RDD持久化到可靠存储
* 常用于迭代算法(如PageRank)
5. 企业级应用
性能调优指标
指标 | 健康范围 | 调优手段 |
---|---|---|
DAG深度 | <10 | 合并窄依赖操作 |
Shuffle写数据量 | <1TB/Stage | 增加分区数或优化业务逻辑 |
Stage并行度 | ≥集群核心数 | 调整 spark.default.parallelism |
诊断命令
# 查看DAG可视化
http://driver-node:4040/stages/
# 导出DAG事件日志
spark-submit --conf spark.eventLog.enabled=true ...
6. 扩展应用场景
- 机器学习:
val model = MLPipeline.fit(trainingData) // 生成优化后的DAG
- 流处理:
val stream = spark.readStream.format("kafka")...
val query = stream.groupBy(window($"time")).count()
- 图计算:
val graph = GraphLoader.edgeListFile(sc, "hdfs://edges")
val ranks = graph.pageRank(tol=0.01)
理解DAG的重要性体现在:
- 执行优化:通过分析依赖关系实现最优调度
- 故障恢复:精确控制重新计算范围
- 资源利用:最大化并行度同时减少网络传输
- 开发指导:帮助开发者设计高效的数据处理流程
这种基于DAG的执行模型,使得Spark能够在大规模数据处理中实现比传统MapReduce快100倍的性能,成为现代大数据生态系统的核心引擎。
热门推荐
陈宗明:传承是加强自我并不断吸收
中医解析脚气的根本原因
带电子手刹的汽车停车顺序及安全要点详解
上海海洋大学水下智能运维机器人团队:到深海探秘 以创新筑梦
离婚后小孩的抚养权归谁所有
未婚子女抚养协议范本:法律要点与实务分析
抢劫罪中以非法占有为目的的认定
抢劫罪中以非法占有为目的的认定
玉发簪易断吗?选购与保养全攻略
银行的大额存款利率与普通存款利率的差异及投资策略?
糖尿病患者常规应该进行哪些检查?
提升企业领导沟通技巧的五大关键策略
壬二酸对皮肤的作用
术后疼痛怎么办?镇痛泵使用指南及常见误区解析
什么是深度学习?——深入解析现代人工智能的核心技术
角色定位培训
轻松搭建VPS服务器的详细步骤与实用指南分享
西芹汁的功效与禁忌:六大好处、营养价值全解析
Redis 持久化机制简介
加强疫苗接种宣传,守护健康未来
构成喀斯特地貌的岩石究竟是什么?
玛丽鱼的养殖方法
玛丽鱼饲养与繁殖指南:如何让玛丽鱼健康成长?
GRE考试内容和题型详解
申请美国研究生,GRE成绩有多重要?全面解析来啦!
发动机冒黑烟常见的24个原因和解决方法
心理学科普|4大释梦理论:梦意味着什么?
私人出售僵尸车是否违法?法律分析及实务探讨
治理"僵尸车"要有创新思维
十大常见B端管理系统,经常用,未必能叫上名字。