【博学谷学习记录】超强总结,用心分享|Spark与PySpark交互流程
一、Spark 和 PySpark 交互流程: Client on Spark集群
(1)首先会在提交的节点上启动一个Driver程序;
(2)Driver启动后,执行Main函数,首先创建SparkContext对象(底层基于py4j,识别Python是如何创建sc对象,将其映射为Java构建sc对象);
(3)连接Spark集群的主节点,根据资源配置要求,向主节点申请资源,用于启动executor;
(4)Master接收到资源申请后,根据申请资源进行分配,底层也是由资源调度器负责,通过FIFO调度方案,将分配好的资源交由给对应的Driver拉取;
(5)Driver连接对应节点,通知worker启动executor,并占用相关的资源,executor程序启动后,反向注册给Driver,告知已经启动完成;
(6)Driver开始处理代码:
1. 首先会加载所有的与RDD相关的API(算子),基于算子之间的依赖关系, 形成DAG(有向无环图)执行流程图,划为stage,并且确定每个阶段应该运行多少个线程以及每一个线程应该由哪个executor来执行(任务分配);
2. Driver程序通知对应的executor,来执行具体的任务;
3. Executor接收到任务信息后,启动线程,开始执行处理:Executor在执行的时候,由于RDD代码中有大量的Python的函数,而Executor是一个jvm程序,无法解析Python函数,此时通过调用Python解释器,执行Python的函数,将函数的执行结果返回即可;
4. Executor在运行的过程中,如果发现最终的结果需要返回Driver,直接返回即可,如果不需要返回,直接输出结束即可;
5. Driver程序监听到这个executor执行的状态信息,当各个executor内的线程都执行完成后,Driver认为任务完成了;
(7)当任务执行完成后,Driver执行后续的相关代码,该打印就打印,该关闭的执行关闭操作,一旦执行stop(),通知Master整个任务执行完成,Master回收资源,Driver程序退出。
二、Spark 和 PySpark 交互流程: Client on Yarn 集群
在 On Yarn模式中,将Driver程序中关于资源的部分从Driver中抛离出来,单独形成一个任务交给Yarn来处理,最终由appMaster来负责的资源的申请Spark具体的任务的分配工作依然是有Driver负责。