1 Spark运行时架构
术语:
驱动器
(Driver
)节点:负责中央协调的节点
执行器
(executor
)节点:与之对应的工作节点
Spark应用
(application
):驱动器节点和所有执行器节点这个整体
- - - Application = Driver(驱动程序) + Executor(执行程序)
集群管理器
(Cluster Manager
):在集群中的机器上启动的外部服务
1.1 驱动器节点
【作用】
把用户进程转换为任务
Spark驱动器程序负责把用户程序转为多个物理执行单元,这些单元称为任务(task)
所有Spark程序都遵循同样的结构:程序从输入数据创建一系列RDD,再使用转化操作派生出新的RDD,再使用转化操作派生出新的RDD,最后使用行动操作收集或存储结果RDD中的数据。
Spark程序其实是隐式地创建出了一个由操作组成的逻辑上的有向无环图
(Directed Acyclic Graph
)对逻辑执行计划做一些优化,比如将连续的映射转为流水线化执行,将多个步骤合并为一个步骤中。这样Spark把逻辑计划转为一系列
步骤
(stage
)为执行器节点调度任务
执行器进程启动后,会向驱动器进程注册自己。
Spark驱动器进程会根据当前的执行器节点集合,尝试把所有任务基于数据所在位置分配给合适的执行器进程。当任务执行时,执行器进程会把缓存数据存储起来,而驱动器进程同样会根据这些缓存数据的位置,并且利用这些位置信息调度以后的任务,以尽量减少数据的网络传输
1.2 执行器节点
Spark执行器节点是一种工作进程
【生命周期】Spark应用启动时,执行器节点就被同时启动,并且始终伴随着整个Spark应用的生命周期而存在。执行器节点的异常和崩溃,并不会导致应用的停止
【作用】
- 负责运行组成Spark应用的任务,并将结果返回给驱动器进程
- 通过自身的块管理器(Block Manager)为用户程序中要求缓存的RDD提供内存式存储
1.3 集群管理器
Spark依赖于集群管理器来启动执行器节点,而在某些特殊情况下,也依赖集群管理器来启动驱动器节点。
集群管理器是Spark中的可拔插式组件
除了自带的独立集群管理器,也可运行在外部集群管理器上,比如YARN Mesos
2 运行Spark应用的详细过程
驱动管理器就是给战略的大boss,资源管理器就是负责执行的组长,执行器就是具体落实的小兵
(1)用户通过spark-submit脚本提交应用
(2)spark-submit脚本启动驱动程序,调用用户定义的main()方法
(3)驱动器程序与集群管理器通信,申请资源以启动执行器节点
(4)集群管理器为驱动器程序启动
(5)驱动器进程执行用户应用中的操作。根据程序中所定义的Pair RDD的转化操作和行动操作,驱动器节点把工作以任务的形式发送到执行器进程
(6)任务在执行器程序中进行计算并保存结果
(7)如果驱动器程序的main( )方法退出,或者调用了SparkContext.stop( ),驱动器程序会终止执行器,并且通过集群管理器释放资源
使用spark-submit部署应用
这一部分很有必要了解一下
bin/spark-submit [options] < app jar | python file> [app option]
没有其他参数,那么spark程序只会在本地执行
–master标记指定要连接的集群URL
值 | 描述 |
---|---|
spark://host:post | 连接到指定端口的spark独立集群,默认窗口7077 |
yarn | 当在YARN上运行时,需要设置环境变量HADOOP_CONF_DIR指向hadoop配置目录,获取集群信息 |
local | 运行本地模式,使用单核 |
local[N] | 运行本地模式,使用N核 |
local[*] | 运行本地模式,使用尽可能多核 |