【博学谷学习记录】超强总结,用心分享| SparkBase核心

1. 两种部署方式说明

当我们通过Spark-submit方式来提交Spark应用到Yarn集群或者Spark集群的时候, 提供了两种部署模式: client 和 cluster

client模式 和 cluster模式本质区别: spark应用程序中Driver程序运行的位置

1.1client模式

client模式: Driver程序是运行在客户端的本地(应用在哪里进行提交, Driver就运行在哪里) 默认值

优势: 测试比较方便, 直接通过Driver看到最终返回的结果

弊端: 由于不在一起(Driver 和 executor 不在一个环境中), 受网络影响因素比较大, 导致执行效率比较低

一般client模式更加适合于测试使用

1.2client模式

cluster模式: Driver程序是运行在集群中某个从节点上

优势: 提升Driver程序和executor程序之间的传输效率 从而提升整体的运行效率

弊端: 由于Driver运行在集群里面. 导致我们无法直接看到运行的结果, 如果想要看到结果, 就必须查看Driver的运行日志

一般在生产上线部署的时候, 采用cluster模式

2.Spark程序与PySpark程序交互流程

2.1 PySpark 和 Spark交互流程: Client on Spark集群

PySpark 和 Spark交互流程: Client on Spark集群

1. 首先会在提交的节点上启动一个Driver程序

2- Driver启动后,执行main函数, 首先创建SparkContext对象(底层是基于py4j, 识别python中如何构建sc对象, 将其映射转换为Java代码来构建sc对象),当Driver启动成功后, 会向Master进行注册, 告知已经启动成功了

3-连接Spark集群的主节点, 根据资源配置要求,向主节点申请资源, 用于启动executor(提交任务的时候, 有默认资源配置,也可以自定义资源)

4-Master接收到资源申请后, 根据申请要求进行分配资源, 底层也会有资源调度器负责, 通过FIFO调度方案,将分配好资源交由给对应Driver拉取即可

executor1: node1 2cpu 3gb

executor2: node3 2cpu 3gb

5- Driver连接对应的节点, 通知Wroker启动Executor, 并占用对应资源, worker程序启动后, 反向注册给Driver, 告知已经启动完成了

6. Driver开始处理代码:

6.1 首先会加载所有的与RDD相关的API(算子),基于算子之间的依赖关系,形成DAG(有向无环图)执行流程图,划分stage阶段, 并且确定每个阶段应该运行多少个线程以及每个线程应该由哪个executor来执行 (任务分配)

6.2 Driver程序通知对应的executor程序, 来执行具体的任务

6.3 Executor接收到任务信息后, 启动线程,开始执行处理即可: Executor咋执行的时候, 由于RDD代码中有大量的python的函数,而executor是一个JVM程序, 无法解析Python函数,此时通过调用Python解析器,执行函数, 将函数的结果返回给Executor

6.4 Executor在运行的过中, 如果发现最终的结果需要返回给Driver, 直接返回Driver即可, 如果不需要返回, 直接输出, 结束即可

6.5 Driver程序监听这个executor执行的状态信息, 当各个Executor都执行完成后, Driver认为任务运行完成了

7. 当任务执行完成后, Driver后续的相关代码, 该打印的打印, 该关闭的执行关闭操作 一旦执行stop() 通知Master任务执行完成, Master回收资源, Driver程序退出

2.2 PySpark 和 Spark交互流程: cluster on Spark集群

PySpark 和 Spark交互流程: cluster on Spark集群

1. 首先会将任务提交到Spark集群的主节点(Master)

2. Master接收到任务信息后, 根据Driver的资源配置信息要求, 选择一个Worker节点(有资源的, 如果都有随机)来启动Driver程序, 并且占用相应资源

3. Driver启动后,执行main函数, 首先创建SparkContext对象(底层是基于py4j, 识别python中如何构建sc对象, 将其映射转换为Java代码来构建sc对象),当Driver启动成功后, 会向Master进行注册, 告知已经启动成功了

4. 根据executor的资源配置要求,向主节点申请资源, 用于启动executor(提交任务的时候, 有默认资源配置,也可以自定义资源)

5-Master接收到资源申请后, 根据申请要求进行分配资源, 底层也会有资源调度器负责, 通过FIFO调度方案,将分配好资源交由给对应Driver拉取即可

executor1: node1 2cpu 3gb

executor2: node3 2cpu 3gb

6- Driver连接对应的节点, 通知Wroker启动Executor, 并占用对应资源, worker程序启动后, 反向注册给Driver, 告知已经启动完成了

7. Driver开始处理代码:

7.1 首先会加载所有的与RDD相关的API(算子),基于算子之间的依赖关系,形成DAG(有向无环图)执行流程图,划分stage阶段, 并且确定每个阶段应该运行多少个线程以及每个线程应该由哪个executor来执行 (任务分配)

7.2 Driver程序通知对应的executor程序, 来执行具体的任务

7.3 Executor接收到任务信息后, 启动线程,开始执行处理即可: Executor咋执行的时候, 由于RDD代码中有大量的python的函数,而executor是一个JVM程序, 无法解析Python函数,此时通过调用Python解析器,执行函数, 将函数的结果返回给Executor

7.4 Executor在运行的过中, 如果发现最终的结果需要返回给Driver, 直接返回Driver即可, 如果不需要返回, 直接输出, 结束即可

7.5 Driver程序监听这个executor执行的状态信息, 当各个Executor都执行完成后, Driver认为任务运行完成了

8. 当任务执行完成后, Driver后续的相关代码, 该打印的打印, 该关闭的执行关闭操作 一旦执行stop() 通知Master任务执行完成, Master回收资源, Driver程序退出

2.3 PySpark 和 Spark的交互流程: client on Yarn 集群

区别点:

将Driver程序中, 负责资源申请的部分, 移交给Yarn集群中AppMaster来负责, Driver主要负责任务的分配以及任务的管理工作

PySpark 和 Spark交互流程: Client on Yarn集群

1. 首先会在提交的节点上启动一个Driver程序

2- Driver启动后,执行main函数, 首先创建SparkContext对象(底层是基于py4j, 识别python中如何构建sc对象, 将其映射转换为Java代码来构建sc对象),当Driver启动成功后, 会向Master进行注册, 告知已经启动成功了

3-连接Yarn集群的主节点, 将需要申请资源以及启动executor工作包装为一个job 任务, 提交给Yarn的主节点, 主节点收到任务后, 首先会随机的选择一个nodemanager启动AppMaster

4-当AppMaster启动后, 会和Yarn的主节点建立心跳机制, 告知已经启动成功了, 启动成功后, 就进行资源申请工作, 将需要申请的资源通过心跳包的形式发送给resourceManager, resourceManager收到资源申请后,开始进行资源分配工作,底层是基于资源调度器来实现(默认: 容量调度器), 当RM将资源分配OK后, 等待AppMaster进行拉取操作, AppMaster会定时的通过心跳的方式, 询问RM是否已经准备好资源, 一旦发现准备好了, 立即获取对应的资源信息

executor1: node1 2cpu 3gb

executor2: node3 2cpu 3gb

5- AppMaster根据获取到的资源信息,连接对应的节点, 通知对应nodemanager启动Executor, 并占用对应资源, nodemanager对应executor进程启动完成后, 反向注册给Driver(通知已经启动成功了)

6. Driver开始处理代码:

6.1 首先会加载所有的与RDD相关的API(算子),基于算子之间的依赖关系,形成DAG(有向无环图)执行流程图,划分stage阶段, 并且确定每个阶段应该运行多少个线程以及每个线程应该由哪个executor来执行 (任务分配)

6.2 Driver程序通知对应的executor程序, 来执行具体的任务

6.3 Executor接收到任务信息后, 启动线程,开始执行处理即可: Executor咋执行的时候, 由于RDD代码中有大量的python的函数,而executor是一个JVM程序, 无法解析Python函数,此时通过调用Python解析器,执行函数, 将函数的结果返回给Executor

6.4 Executor在运行的过中, 如果发现最终的结果需要返回给Driver, 直接返回Driver即可, 如果不需要返回, 直接输出, 结束即可

6.5 Driver程序监听这个executor执行的状态信息, 当各个Executor都执行完成后, Driver认为任务运行完成了,同时AppMaster也会接收到各个节点执行完成的状态, 通知RM, 任务执行完成, RM回收资源, 关闭AppMaster, 并通知Driver程序

7. 当任务执行完成后, Driver后续的相关代码, 该打印的打印, 该关闭的执行关闭操作 一旦执行stop(), 退出Driver程序

2.4 PySpark 和 Spark的交互流程: cluster on Yarn 集群

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值