原 [Kafka与Spark集成系列四] Spark运行结构https://blog.csdn.net/u013256816/article/details/82082146版权声明:本文为博主原创文章,未经博主朱小厮允许不得转载。 https://blog.csdn.net/u013256816/article/details/82082146
欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。
在分布式环境下,Spark集群采用的是主从架构。如下图所示,在一个Spark集群中,有一个节点负责中央协调,调度各个分布式工作节点,这个中央协调节点被称为驱动器(Driver)节点,与之对应的工作节点被称为执行器(Executor)节点。驱动器节点可以和大量的执行器节点进行通信,它们也都作为独立的进程运行。驱动器节点和所有的执行器节点一起被称为一个Spark应用(Application)。
Spark应用通过一个叫做集群管理器(Cluster Manager)的外部服务在集群中的机器上启动。Spark自带的集群管理器被称为独立集群管理器。Spark也能运行在YARN、Mesos、Kubernetes这类开源集群管理器上。
Spark驱动器节点是执行你程序中的main()方法的进程。它执行用户编写的用来创建SparkContext、创建RDD,以及进行RDD的转换操作和行动操作的代码。其实,当你启动spark-shell时,你就启动了一个Spark驱动程序。驱动程序一旦停止,Spark应用也就结束了。
驱动器程序在Spark应用中有两个职责:把用户程序转为任务以及为执行器节点调度任务。
Spark驱动器程序负责把用户程序转为多个物理执行的单元,这些单元也被称为任务(Task)。任务是Spark中最小的工作单元,用户程序通常要启动成百上千的独立任务。从上层来看,所有的Spark程序都遵循同样的结构:程序从输入数据创建一系列RDD,再使用转换操作派生出新的RDD,最后使用行动操作收集或存储结果RDD中的数据。Spark程序其实是隐式地创建出了一个由操作组成的逻辑上的有向无环图(Directed Acyclic Graph,简称DAG)。当驱动器程序运行时,它会把这个逻辑图转为物理执行计划。
有了物理执行计划之后,Spark驱动器程序必须在各执行器进程间协调任务的调度。执行器进程启动后,会向驱动器进程注册自己。因此,驱动器进程始终对应用中所有的执行器节点有完整的记录。每个执行器节点代表一个能够处理任务和存储RDD数据的进程。
Spark驱动器程序会根据当前的执行器节点集合,尝试把所有任务基于数据所在位置分配给合适的执行器进程。当任务执行时,执行器进程会把缓存数据存储起来,而驱动器进程同样会跟踪这些缓存数据的位置,并且利用这些位置信息来调度以后的任务,以尽量减少数据的网络传输。
Spark执行器节点是一种工作进程,负责在Spark作业中运行任务,任务间相互独立。Spark应用启动时,执行器节点就被同步启动,并且始终伴随着整个Spark应用的生命周期而存在。如果有执行器节点发生了异常或崩溃,Spark应用也可以继续执行。执行器进程有两大作用:第一,它们负责运行组成Spark应用的任务,并将结果返回给驱动器进程;第二,它们通过自身的块管理器(Block Manager)为用户程序中要求缓存的RDD提供内存式存储。RDD是直接缓存在执行器进程内的,因此任务可以在运行时充分利用缓存数据加速运算。
Spark依赖于集群管理器来启动执行器节点,而在某些特殊的情况下,也依赖集群管理器来启动驱动器节点。集群管理器是Spark中的可插拔式组件,这样既可选择Spark自带的独立集群管理,也可以选择前面所提及的YARN、Mesos之类的外部集群管理器。
不论你使用的是哪一种集群管理器,你都可以使用Spark提供的统一脚本spark-submit将你的应用提交到那种集群管理器上。通过不同的配置选项,spark-submit可以连接到相应的集群管理器上,并控制应用所使用的资源数量。在使用某些特定集群管理器时,spark-submit也可以将驱动器节点运行在集群内部(比如一个YARN的工作节点)。但对于其他的集群管理器,驱动器节点只能被运行在本地机器上。
在集群上运行spark应用的详细过程为:1. 用户通过spark-submit脚本提交应用。2. spark-submit脚本启动驱动器程序,调用用户定义的main()方法。3. 驱动器程序与集群管理器通信,申请资源以启动执行器节点。4. 集群管理器为驱动器程序启动执行器节点。5. 驱动器进行执行用户应用中的操作。根据程序中所定义的对RDD的转换操作和行动操作,驱动器节点把工作以任务的形式发送到执行器进行。6. 任务在执行器程序中进行计算并保存结果。7. 如果驱动器程序的main()方法退出,或者调用了SparkContext.stop(),驱动器程序会终止执行器进程,并且通过集群管理器释放资源。
欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。
Kafka与Spark集成系列四Spark运行结构
最新推荐文章于 2024-01-03 11:26:39 发布