什么是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倍的性能,成为现代大数据生态系统的核心引擎。
热门推荐
软件定义了什么:探索软件的本质与功能
天国拯救2马匹排行榜:七种马匹特点与适用场景全解析
构建药品质量保证体系,确保患者安全用药
住宅物业收费标准调整九问九答
股市双头现象意味着什么?这种现象如何影响市场?
从 FC、NFC 到 HPP 果汁,它们有什么区别?
北京大学教师工资待遇详解:18-24万年薪,网友:这是真的吗?
北京大学教师工资待遇详解,在18—24万之间,网友:这是真的吗
这届年轻人选择“穷养自己,富养宠物”
大筒木舍人:从吐槽到T0,全能忍者凭何逆袭?
脾胃湿热吃什么食物好
甜味之源:全球不同文化下的甜食鉴赏
商业模式画布BMC入门指南:模块、实操与工具
大型APP的产品经理是怎么优化迭代产品的
软件工程中的7种耦合和内聚(详解)
DHA:大脑发育与记忆力提升的关键营养素
A股:散户找不到主力?只需看一眼“OBV指标”就够了,简单又实用
阳江之旅:山海间的岭南明珠日记
越厉害的领导,越懂得这样和下属谈心
新买的四件套需要洗吗?如何正确清洗床上四件套?
照顾猫咪的清洁卫生(宠物爱好者必看的15个小贴士)
金钱能买来胜利吗?评估里皮天价薪资对中国足球的影响
甲木生于午月木火通明:命理学中的五行平衡与挑战
低脂蔬菜沙拉制作指南:健康美味两不误
遇见色彩 | 温暖月光色,随人千里,一夜入梦
如何通过技能培养促进孕妇的情绪稳定?
别再被误导了!光伏发电5年回本到底是真是假?
揭秘番茄细菌性斑点病:发生规律与综合防治策略
项羽至死不愿渡江的真相:只因他发现了一个秘密,他彻底绝望了
高考和模拟考试的成绩差距大吗?退休多年班主任说出实话,不一样的地方有很多!