Spark十二 集群运行
1 运行时架构
1) 驱动器节点Driver
驱动器程序的两个功能
> 把用户程序转化为任务
(1) 驱动器程序把用户程序转为多个物理执行单元,称为任务
(2) 程序从输入数据创建一系列RDD,转化操作生成新的RDD,最后执行行动操作
(3) 由操作隐式创建逻辑有向无环图,驱动器运行时把DAG转为物理执行计划
(4) Spark把DAG转为一系列步骤,每个步骤由多个任务组成,任务是Spark的最小工作单元
> 为执行器节点调度任务
(1) 驱动器程序在各执行器进程间协调任务的调度
(2) 执行器进程启动后,在驱动器进程注册自己,每个执行器节点代表一个能够处理任务和存储RDD的进程
(3) 驱动器程序根据当前执行器节点集合位置,分配合适的执行器进程
(4) 执行器进程将数据缓存后,驱动器程序会跟踪缓存数据的位置,并继续调度之后的任务,减少网络传输
2) 执行器节点
> 是工作进程,负责在Spark中运行任务,任务相互独立
> 所有执行器节点同时启动,伴随Spark应用的声明周期
> 两大作用
(1) 运行任务,将结果返回给驱动器程序
(2) 通过块管理器(Block Manager)为RDD提供内存式存储
3) 集群管理器
> 集群管理器是可插拔的,独立调度器,YARN,Mesos
> 申请资源启动执行器节点,有时用来启动驱动器节点
总结:
(1) 用户使用spark-submit脚本提交应用
(2) 脚本启动驱动器程序,调用用户定义的main()
(3) 驱动器程序与集群管理器通信,申请资源启动执行器节点
(4) 集群管理器为驱动器程序启动执行器节点
(5) 驱动器进程执行引用操作,根据定义的转化操作和行动操作,把工作以任务的方式发送到执行器进程
(6) 任务在执行器进程中计算并保存结果
(7) 退出main(),或者调用SparkContext.stop(),驱动器程序终止执行器进程,通过集群管理器释放资源
2 spark-submit部署应用
1) 提交用户作业的统一工具 spark-submit
2) 控制应用运行细节,一调度信息,二运行时依赖
3 打包代码和依赖
如果依赖多个库,需要打包成一个大的jar包,使用:
1) Maven
2) sbt
3) 依赖冲突
> 修改应用依赖库的版本
> "shading"
4 应用间和应用内调度
配置调度策略,如公平调度器
5 集群管理器
独立集群调度器,YARN, EC2, Mesos