spark 源码分析

spark 

一、 启动篇

(一) 引子 在spark-shell终端执行

val arr = Array(1,2,3,4) val rdd = sc.makeRDD(arr)
rdd.collect

alt

以上3行代码构成了一个完整的spark job执行。

(二) 启动篇

shell模式
alt shell模式下启动入口:org.apache.spark.repl. Main
submit模式
spark的启动过程就是实例化SparkContext的过程,涉及到driver、和executor端两边
1. SparkSubmit

AppClient
根据shell文件可以得知, spark入口是org.apache.spark.deploy.SparkSubmit,依次打印各类信息,其中最引人注目的是welcome信息

在源码中的体现:

alt 在SparkSubmit中,执行main函数 1.根据外部参数(在我们应用中对应启动sh文件中的参数)构造SparkSubmitArguments
2.调用submit方法
alt 2.1 构造运行环境:
根据步骤1中构造的SparkSubmitArguments对象,确定运行环境,例如master 、deployMode、childMainClass,如果是yarn-cluster,使用org.apache.spark.deploy.yarn.YarnClusterApplication(有的资料上显示是org.apache.spark.deploy.yarn.Client可能是老版本,YarnClusterApplication这个class与org.apache.spark.deploy.yarn.Client在同一个scala文件中)作为childMainClass;如果是mesos-cluster,使用org.apache.spark.deploy.rest.RestSubmissionClient作为childMainClass;如果是standalone模式,使用org.apache.spark.deploy.rest.RestSubmissionClient作为childMainClass

alt 2.2 反射出上一步骤的生成的 childMainClass,调用其main方法
alt alt alt alt 以yarn-cluster模式下,org.apache.spark.deploy.yarn.YarnClusterApplication启动(在spark-yarn这个module里,与org.apache.spark.deploy.yarn.Client在同一个scala文件中)

 

以yarn-cluster模式下,org.apache.spark.deploy.yarn.YarnClusterApplication启动(在spark-yarn这个module里,与org.apache.spark.deploy.yarn.Client在同一个scala文件中) alt alt 最终调用Client.run()方法: alt 在submitApplication方法中,在经过一些初始化操作后,提交请求到ResouceManager,检查集群的内存情况,检验集群的内存等资源是否满足当前的作业需求,最后正式提交application alt alt 在createContainerLaunchContext方法中,用反射创建ApplicationMaster,负责运行Spark Application的Driver程序,并分配执行需要的Executors。 alt alt alt alt alt alt alt 在ApplicationMaster中,其run方法中调用runImpl,如果是集群模式,调用runDriver启动driver端和executor端 alt alt alt alt 在runDriver方法中,调用startUserApplication方法,创建一个线程,用反射构造出启动脚本中的MainClass,并在线程中执行其main方法。调用registerAM方法,注册driver到yarn集群,并为executor分配资源并启动。 alt alt 在startUserApplication方法中, alt alt alt userClassThread.join通过运行startUserApplication方法返回的线程启动Driver
在其run方法中,通过反射执行userClass中的main方法启动Driver。

  1. Driver篇
    alt Spark会将Driver中的任务提交给Executor中,具体的计算是发生在Executor上,调用线程,在线程池用运行计算,每个任务都会有独立的Executor计算。
    1) SparkContext
    在Driver端SparkContext初始化中, 调用createTaskScheduler方法创建SchedulerBackend和TaskScheduler,实例化DAGScheduler,然后调用TaskScheduler.start方法启动TaskScheduler alt
Apache Spark是一个分布式计算框架,它支持内存中的数据处理,大大提高了大数据批处理的速度,并且还能够用于实时流式处理、机器学习等场景。 ### 源码结构 Spark源码非常庞大而复杂,但可以大致分为以下几个模块: 1. **Core Module** 这是整个项目的基石,包含了任务调度系统(Scheduler)、依赖管理机制以及底层的RDD操作逻辑。理解这部分有助于掌握如何构建高效的任务分发及执行流程。 2. **SQL Module (Catalyst Optimizer)** Catalyst 是 Spark SQL 中的一个查询优化引擎。通过规则匹配的方式对输入表达式树进行转换,以此达到提高性能的目的。例如,自动选择最优物理计划或者简化某些特定模式下的表达式求值过程。 3. **Streaming Module** 实现了微批次架构来模拟连续的数据流入流出特性。开发者可以通过简单的API快速搭建起强大的实时应用;同时内部也包含了许多针对时间窗口运算的设计考量点。 4. **MLlib / GraphX Modules** MLlib 提供了一系列常用的机器学习算法库及其相关的工具函数;GraphX 则专注于图模型方面的研究工作,如PageRank 算法实现等。 5. **Other Components** 包含Shuffle Manager, Storage Layer, Metrics System等功能组件,在实际运行过程中起到辅助作用。 ### 关键设计原则 - **弹性分布式数据集(RDD)** RDD是一种只读的分区记录集合,它可以并行地存储在集群节点上并且允许用户施加各种变换(transformation),最终得到新的RDD实例。这种不可变性保证了容错性的简单性和效率最大化。 - **宽窄依赖关系(Wide/Narrow Dependencies)** 根据算子之间的连接方式将DAG划分成Stage阶段时所考虑的因素之一。“窄”表示每个parent partition仅对应少量child partitions,“宽”的情况反之亦然。这直接影响到shuffle文件大小和网络传输成本等问题。 - **延迟加载(Lazy Evaluation)** 当创建一个新RDD之后并不会立即开始计算,而是等到触发Action才会真正启动作业。这一策略不仅节省资源而且便于做更精细粒度的错误恢复措施。 为了深入探究其原理建议从官方文档入手逐步探索各个部分的核心功能接口定义,再结合社区贡献者的博客文章加深认识。此外,GitHub 上面也有很多基于不同版本解读整套体系的文章可供参考。 --
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值