「这是我参与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收到任务处理完成的信息后, 回收资源即可