Spark 架构原理
Spark 架构原理
Apache Spark是一种快速、通用的集群计算系统,它通过基于DAG的任务调度和内存计算策略,提供了比传统MapReduce更高的处理速度和更灵活的编程模型。本文将深入探讨Spark的核心架构原理,包括其计算阶段划分、作业管理和执行过程,并与MapReduce进行对比分析。
Spark的计算阶段
与MapReduce相比,Spark的计算框架更加富有弹性和灵活性。MapReduce将一个应用的计算分为严格的Map和Reduce两个阶段,而Spark可以根据应用的复杂程度,将其分割成更多的计算阶段(stage)。这些计算阶段组成一个有向无环图(DAG),Spark任务调度器可以根据DAG的依赖关系执行计算阶段。
例如,在机器学习算法中,某些算法可能需要进行大量的迭代计算,产生数万个计算阶段。在Spark中,这些计算阶段可以在一个应用中处理完成,而不是像MapReduce那样需要启动数万个应用,因此极大地提高了运行效率。
上图描述了一个典型的Spark运行DAG的不同阶段。整个应用被切分成3个阶段,阶段3需要依赖阶段1和阶段2,阶段1和阶段2互不依赖。Spark在执行调度的时候,先执行阶段1和阶段2,完成以后,再执行阶段3。
Spark的作业管理
Spark中的RDD函数分为两种:转换函数和action函数。转换函数调用后得到的还是一个RDD,而action函数调用后不再返回RDD。例如,count()
函数返回RDD中数据的元素个数,saveAsTextFile(path)
将RDD数据存储到指定路径下。
DAGScheduler在遇到shuffle时会生成一个计算阶段,在遇到action函数时会生成一个作业(job)。RDD中的每个数据分片,Spark都会创建一个计算任务去处理,所以一个计算阶段会包含很多个计算任务(task)。
Spark的执行过程
Spark支持多种部署方案,包括Standalone、Yarn、Mesos和Kubernetes等。其核心执行流程如下:
- Spark应用程序启动在自己的JVM进程里,即Driver进程,启动后调用SparkContext初始化执行配置和输入数据。
- SparkContext启动DAGScheduler构造执行的DAG图,切分成最小的执行单位也就是计算任务。
- Driver向Cluster Manager请求计算资源,用于DAG的分布式计算。
- Cluster Manager收到请求后,将Driver的主机地址等信息通知给集群的所有计算节点Worker。
- Worker收到信息后,根据Driver的主机地址,跟Driver通信并注册,然后根据自己的空闲资源向Driver通报自己可以领用的任务数。
- Driver根据DAG图开始向注册的Worker分配任务。
- Worker收到任务后,启动Executor进程开始执行任务。Executor先检查自己是否有Driver的执行代码,如果没有,从Driver下载执行代码,通过Java反射加载后开始执行。
总结
Spark具有三个主要特性:
- RDD的编程模型更简单
- DAG切分的多阶段计算过程更快速
- 使用内存存储中间计算结果更高效
这些特性使得Spark相对Hadoop MapReduce可以有更快的执行速度,以及更简单的编程实现。Spark的出现和流行,得益于内存容量和成本的提升,以及机器学习等复杂计算需求的增加,这些因素共同推动了Spark成为大数据处理领域的主流框架。