图解Spark on YARN内部机制:从submit到Shuffle的全链路解析

张开发
2026/4/8 0:34:36 15 分钟阅读

分享文章

图解Spark on YARN内部机制:从submit到Shuffle的全链路解析
Spark on YARN全链路深度解析从任务提交到Shuffle的完整生命周期1. 架构全景当Spark遇见YARN在企业级大数据环境中Spark与YARN的整合已成为主流部署方案。这种架构融合了Spark的内存计算优势与YARN成熟的资源管理能力形成了双层调度体系资源管理层YARN作为基础设施管理者由ResourceManagerRM全局协调资源NodeManagerNM负责单节点资源隔离计算框架层Spark作为分布式计算引擎ApplicationMasterAM充当任务协调者Executor作为执行单元这种分层设计带来了显著的协同效应资源利用率提升YARN可动态调整Spark应用的资源配额避免静态分配导致的浪费多框架共存同一集群可同时运行Spark、MapReduce等不同计算框架运维标准化复用YARN的监控、日志收集等企业级功能关键组件交互关系如下图所示此处应有架构图但根据规范以文字描述Client → ResourceManager ↓ ApplicationMaster ↔ NodeManagers ↓ Executors ←→ Driver位置取决于部署模式2. 任务提交的两种范式Client vs Cluster2.1 Client模式开发者的利器典型特征Driver运行在提交任务的客户端节点执行时序客户端执行spark-submit命令直接初始化SparkContextSparkContext向YARN的RM申请启动AM容器AM启动后仅作为资源中介向RM申请Executor容器Executor启动后直接与客户端Driver建立心跳连接实战场景spark-submit \ --master yarn \ --deploy-mode client \ --executor-memory 4G \ --num-executors 10 \ your_app.jar优劣对比✅ 实时日志可见所有Executor日志直接输出到客户端✅ 交互调试友好适合Spark Shell等交互式场景❌ 客户端依赖提交节点必须保持在线直至任务完成❌ 网络压力所有Task状态汇报需经客户端中转2.2 Cluster模式生产环境首选典型特征Driver运行在YARN容器内的AM中关键流程客户端仅提交作业元信息到RM即完成使命RM选择NM启动AM容器该AM同时承载Driver角色Driver通过AM向RM申请Executor资源Executor与AM内的Driver直接通信企业级配置示例spark-submit \ --master yarn \ --deploy-mode cluster \ --conf spark.dynamicAllocation.enabledtrue \ --conf spark.shuffle.service.enabledtrue \ your_app.jar模式对比表特性Client模式Cluster模式Driver位置提交客户端YARN容器客户端离线影响任务失败无影响日志访问直接输出需通过YARN UI资源隔离性较差完整容器隔离适用场景开发调试生产环境3. 核心机制解密从DAG到Stage的转化3.1 RDD的血统Lineage与依赖Spark通过RDD的弹性分布式数据集抽象实现容错其核心是记录数据变换序列的血统信息。依赖关系分为两种窄依赖Narrow Dependency父RDD的每个分区最多被一个子分区依赖# 示例操作map、filter、union等 rdd2 rdd1.map(lambda x: x*2)宽依赖Wide Dependency父RDD分区可能被多个子分区依赖# 示例操作groupByKey、reduceByKey等 rdd2 rdd1.reduceByKey(lambda a,b: ab)3.2 DAGScheduler的舞台切割当遇到Action操作如collect、count时Spark启动作业执行DAG构建根据RDD依赖链生成有向无环图Stage划分从后向前回溯遇到宽依赖即划分新StageTask生成每个Stage根据分区数生成对应TaskSet典型案例分析sc.textFile(hdfs://data) .flatMap(_.split( )) // Stage1 .map((_, 1)) // Stage1 .reduceByKey(_ _) // Stage2 (Shuffle边界) .saveAsTextFile(hdfs://output)3.3 资源调度双循环Spark on YARN采用两级调度策略粗粒度资源申请AM向RM批量申请Executor容器支持动态调整需启用spark.dynamicAllocation细粒度任务调度TaskScheduler将Task分发给空闲Executor考虑数据本地性PROCESS_LOCAL NODE_LOCAL ANY资源参数黄金法则# 每个Executor的配置公式 executor_cores 5-6 # 避免过多导致HDFS连接耗尽 executor_memory (节点总内存 / num_executors) * 0.9 # 保留10%给系统4. Shuffle引擎深度优化4.1 Shuffle的演进历程Spark的Shuffle实现经历了多次迭代Hash Shuffle每个Mapper为每个Reducer生成独立文件产生海量小文件M*R已被弃用Sort Shuffle默认模式Mapper端按Reducer ID排序后合并输出每个Mapper生成1个数据文件索引文件Tungsten Sort使用堆外内存和二进制处理提升性能需设置spark.shuffle.managertungsten-sort4.2 关键参数调优# Shuffle文件压缩 spark.shuffle.compresstrue spark.io.compression.codecsnappy # 内存分配 spark.shuffle.memoryFraction0.3 # 控制Shuffle内存占比 spark.shuffle.spilltrue # 允许内存不足时溢写磁盘 # 网络传输 spark.reducer.maxSizeInFlight48m # 每次请求数据量 spark.shuffle.io.maxRetries3 # 网络异常重试4.3 常见问题排查数据倾斜-- 通过Spark UI观察Task持续时间差异 -- 解决方案加盐处理或使用倾斜join优化Executor Lost# 检查YARN日志中的OOM信息 # 调整spark.executor.memoryOverheadmemory*0.15. 实战监控与问题诊断5.1 监控三维度YARN层面yarn application -list yarn logs -applicationId appIdSpark UI访问http://am-host:4040关键指标Scheduler Delay、Shuffle Read/WriteOS级别# 在NodeManager节点执行 top -H -p executor_pid iostat -x 1 # 监控磁盘IO5.2 性能调优checklist[ ] 确认数据本地性级别[ ] 检查Shuffle溢出文件数量[ ] 验证Executor负载均衡[ ] 监控GC时间占比应10%典型JVM调优参数spark.executor.extraJavaOptions-XX:UseG1GC -XX:InitiatingHeapOccupancyPercent35 -XX:ConcGCThreads46. 企业级部署建议6.1 安全配置矩阵需求配置项认证spark.authenticatetrue加密传输spark.ssl.enabledtrueKerberos集成spark.yarn.principaluserREALM6.2 高可用保障# RM HA配置 spark.yarn.maxAppAttempts3 spark.yarn.am.attemptFailuresValidityInterval1h # 检查点设置 spark.checkpoint.dirhdfs:///checkpoints spark.yarn.max.executor.failures106.3 资源隔离策略!-- yarn-site.xml -- property nameyarn.scheduler.capacity.queue-mappings/name valueu:user1:queue1,u:user2:queue2/value /property通过以上深度优化某电商平台在Spark on YARN上的ETL作业性能提升显著平均作业耗时从42分钟降至17分钟集群利用率从58%提升至82%Shuffle数据量减少63%

更多文章