spark程序与pySpark交互流程

469 阅读6分钟

「这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战

1.spark程序与pySpark交互流程

以下分为·四种情况一一阐述

以提交到yarn集群:  部署方式为 cluster
	1- 由执行spark-submit脚本提交任务到 resourcemanager(yarn主节点), yarn会为这个任务启动一个applicationMaster程序,后续与任务相关的操作都找这个applicationMaster即可 (任意某个从节点)
	2- appMaster会根据任务的信息分别启动Driver程序(让自己同时升级为Driver程序),然后根据executor资源信息向yarn主节点申请资源, 用于启动executor
	3- 当appMaster拿到用于启动executor的资源后, 通知想对应的从节点启动executor执行器即可, 当对应节点执行器启动后, 反向响应给Driver程序, 已经启动好了
	4- Driver程序就会开始进行任务的执行流程图生成. 此时就会产生DAG执行流程图, 划分各个执行stage节点, 以及划分分区数等操作:
		4.1: 首先根据py4j 读取spark程序中代码,创建sparkContext对象
		4.2: 检查后续一共使用到那些算子, 根据这些算子划分stage阶段(每个节点划分为几个分区, 对应有几个线程执行), 并生成DAG执行流程图
		4.3: 通知各个executor进行执行对应任务操作即可
		4.4: 监控各个executor执行进度, 等待执行完成, 关闭sparkContext对象, 释放资源, 通知AppMaster已经执行完成
	5. executor接收到Driver程序分配任务后, 开始运行执行任务即可, 如果任务的结果需要返回给Driver, 此时将结果数据返回即可, 如果不需要, 直接输出操作, 那么Task程序就直接将结果输出即可
	6. AppMaster收到Driver程序处理完成的信息后, 通知yarn的主节点, 任务执行完成, 回收资源并关闭整个任务
	
以提交到yarn集群:  部署方式为 client
	1- 由执行spark-submit脚本提交任务, 会在当前这个节点根据提交信息启动一个Driver程序, 由这个Driver向yarn的主节点提交任务操作,  yarn会为这个任务启动一个applicationMaster程序,后续与任务相关的操作都找这个applicationMaster即可 (任意某个从节点)
	2- appMaster会根据executor资源信息向yarn主节点申请资源, 用于启动executor
	3- 当appMaster拿到用于启动executor的资源后, 通知相对应的从节点启动executor执行器即可, 当对应节点执行器启动后, 反向响应给Driver程序, 已经启动好了
	4- Driver程序就会开始进行任务的执行流程图生成. 此时就会产生DAG执行流程图, 划分各个执行stage节点, 以及划分分区数等操作:
		4.1: 首先根据py4j 读取spark程序中代码,创建sparkContext对象
		4.2: 检查后续一共使用到那些算子, 根据这些算子划分stage阶段(每个节点划分为几个分区, 对应有几个线程执行), 并生成DAG执行流程图
		4.3: 通知各个executor进行执行对应任务操作即可
		4.4: 监控各个executor执行进度, 等待执行完成, 关闭sparkContext对象, 释放资源, 通知AppMaster已经执行完成
	5. executor接收到Driver程序分配任务后, 开始运行执行任务即可, 如果任务的结果需要返回给Driver, 此时将结果数据返回即可, 如果不需要, 直接输出操作, 那么Task程序就直接将结果输出即可
	6. AppMaster收到Driver程序处理完成的信息后, 通知yarn的主节点, 任务执行完成, 回收资源并关闭整个任务


如果要提交到spark集群, 就是没有appMaster,所有工作都是有Driver程序来负责的 : 

提交spark集群:  cluster模式
	1- 由执行spark-submit脚本提交任务到 spark集群的Master节点, Master会根据提交信息, 在某一个worker节点上, 启动一个Driver程序
	2- Driver程序根据executor资源信息向Master主节点申请资源, 用于启动executor
	3- 当Driver拿到用于启动executor的资源后, 通知想对应的从节点启动executor执行器即可, 当对应节点执行器启动后, 反向响应给Driver程序, 已经启动好了
	4- Driver程序就会开始进行任务的执行流程图生成. 此时就会产生DAG执行流程图, 划分各个执行stage节点, 以及划分分区数等操作:
		4.1: 首先根据py4j 读取spark程序中代码,创建sparkContext对象
		4.2: 检查后续一共使用到那些算子, 根据这些算子划分stage阶段(每个节点划分为几个分区, 对应有几个线程执行), 并生成DAG执行流程图
		4.3: 通知各个executor进行执行对应任务操作即可
		4.4: 监控各个executor执行进度, 等待执行完成, 关闭sparkContext对象, 释放资源, 通知Master , 任务已经执行完成
	5. executor接收到Driver程序分配任务后, 开始运行执行任务即可, 如果任务的结果需要返回给Driver, 此时将结果数据返回即可, 如果不需要, 直接输出操作, 那么Task程序就直接将结果输出即可
	6. master收到任务处理完成的信息后, 回收资源即可


提交spark集群:  client模式
	1- 由执行spark-submit脚本提交任务, 会在当前这个节点根据提交信息启动一个Driver程序, Driver程序会根据资源信息,向Master申请资源, 用于启动executor
	2- 当Driver拿到用于启动executor的资源后, 通知相对应的从节点启动executor执行器即可, 当对应节点执行器启动后, 反向响应给Driver程序, 已经启动好了
	4- Driver程序就会开始进行任务的执行流程图生成. 此时就会产生DAG执行流程图, 划分各个执行stage节点, 以及划分分区数等操作:
		4.1: 首先根据py4j 读取spark程序中代码,创建sparkContext对象
		4.2: 检查后续一共使用到那些算子, 根据这些算子划分stage阶段(每个节点划分为几个分区, 对应有几个线程执行), 并生成DAG执行流程图
		4.3: 通知各个executor进行执行对应任务操作即可
		4.4: 监控各个executor执行进度, 等待执行完成, 关闭sparkContext对象, 释放资源, 通知Master , 任务已经执行完成
	5. executor接收到Driver程序分配任务后, 开始运行执行任务即可, 如果任务的结果需要返回给Driver, 此时将结果数据返回即可, 如果不需要, 直接输出操作, 那么Task程序就直接将结果输出即可
	6. master收到任务处理完成的信息后, 回收资源即可