注:大家觉得博客好的话,别忘了点赞收藏呀,本人每周都会更新关于人工智能和大数据相关的内容,内容多为原创,Python Java Scala SQL 代码,CV NLP 推荐系统等,Spark Flink Kafka Hbase Hive Flume等等~写的都是纯干货,各种顶会的论文解读,一起进步。
今天继续和大家分享一下Pyspark基础入门2
#博学谷IT学习技术支持
本质: 将Spark程序运行在Yarn集群中, 由Yarn集群完成资源调度工作
cd /export/server/spark/bin/
./spark-submit \
--master yarn \
--conf "spark.pyspark.driver.python=/root/anaconda3/bin/python3" \
--conf "spark.pyspark.python=/root/anaconda3/bin/python3" \
/export/server/spark/examples/src/main/python/pi.py 100
将编写的WordCount的代码提交到Yarn平台运行
./spark-submit \
--master yarn \
--conf "spark.pyspark.driver.python=/root/anaconda3/bin/python3" \
--conf "spark.pyspark.python=/root/anaconda3/bin/python3" \
/export/data/workspace/ky06_pyspark/_01_SparkBase/src/_05_pyspark_wd.py
当我们通过Spark-submit方式来提交Spark应用到Yarn集群或者Spark集群的时候, 提供了两种部署模式: client 和 cluster
client模式 和 cluster模式本质区别: spark应用程序中Driver程序运行的位置
client模式: Driver程序是运行在客户端的本地(应用在哪里进行提交, Driver就运行在哪里) 默认值
优势: 测试比较方便, 直接通过Driver看到最终返回的结果
弊端: 由于不在一起(Driver 和 executor 不在一个环境中), 受网络影响因素比较大, 导致执行效率比较低
一般client模式更加适合于测试使用
cluster模式: Driver程序是运行在集群中某个从节点上
优势: 提升Driver程序和executor程序之间的传输效率 从而提升整体的运行效率
弊端: 由于Driver运行在集群里面. 导致我们无法直接看到运行的结果, 如果想要看到结果, 就必须查看Driver的运行日志
一般在生产上线部署的时候, 采用cluster模式
client模式
./spark-submit \
--master yarn \
--deploy-mode client \
--conf "spark.pyspark.driver.python=/root/anaconda3/bin/python3" \
--conf "spark.pyspark.python=/root/anaconda3/bin/python3" \
/export/data/workspace/ky06_pyspark/_01_SparkBase/src/_02_pyspark_wd.py
./spark-submit \
--master yarn \
--deploy-mode cluster \
--conf "spark.pyspark.driver.python=/root/anaconda3/bin/python3" \
--conf "spark.pyspark.python=/root/anaconda3/bin/python3" \
/export/data/workspace/ky06_pyspark/_01_SparkBase/src/_02_pyspark_wd.py
首先会在提交的节点上启动一个Driver程序
Driver启动后,执行main函数, 首先创建SparkContext对象(底层是基于py4j, 识别python中如何构建sc对象, 将其映射转换为Java代码来构建sc对象),当Driver启动成功后, 会向Master进行注册, 告知已经启动成功了
连接Yarn集群的主节点, 将需要申请资源以及启动executor工作包装为一个job 任务, 提交给Yarn的主节点, 主节点收到任务后, 首先会随机的选择一个nodemanager启动AppMaster
当AppMaster启动后, 会和Yarn的主节点建立心跳机制, 告知已经启动成功了, 启动成功后, 就进行资源申请工作, 将需要申请的资源通过心跳包的形式发送给resourceManager, resourceManager收到资源申请后,开始进行资源分配工作,底层是基于资源调度器来实现(默认: 容量调度器), 当RM将资源分配OK后, 等待AppMaster进行拉取操作, AppMaster会定时的通过心跳的方式, 询问RM是否已经准备好资源, 一旦发现准备好了, 立即获取对应的资源信息
executor1: node1 2cpu 3gb
executor2: node3 2cpu 3gb
AppMaster根据获取到的资源信息,连接对应的节点, 通知对应nodemanager启动Executor, 并占用对应资源, nodemanager对应executor进程启动完成后, 反向注册给Driver(通知已经启动成功了)
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程序
当任务执行完成后, Driver后续的相关代码, 该打印的打印, 该关闭的执行关闭操作 一旦执行stop(), 退出Driver程序
区别点:
在集群模式下, Driver程序 和 AppMaster 二者合二为一, Driver就是AppMaster. AppMaster就是我们的Driver
PySpark 和 Spark交互流程: cluster on Yarn集群
首先会将任务提交到Yarn集群的主节点(resourceManager RM)
RM接收到任务信息后, 根据Driver(AppMaster)的资源配置信息的要求, 选择一个NodeManager节点(有资源, 如果都有随机)来启动Driver(AppMaster)程序,并且占用相应的资源
Driver(AppMaster)启动后, 执行main函数, 首先创建SparkContext对象(底层是基于py4j, 识别python中如何构建sc对象, 将其映射转换为Java代码来构建sc对象),当Driver启动成功后, 会向RM进行注册, 告知已经启动成功了
当Driver(AppMaster)启动后, 会和Yarn的主节点建立心跳机制 启动成功后, 就进行Executor资源申请工作, 将需要申请的资源通过心跳包的形式发送给resourceManager, resourceManager收到资源申请后,开始进行资源分配工作,底层是基于资源调度器来实现(默认: 容量调度器), 当RM将资源分配OK后, 等待Driver(AppMaster)进行拉取操作, Driver(AppMaster)会定时的通过心跳的方式, 询问RM是否已经准备好资源, 一旦发现准备好了, 立即获取对应的资源信息
executor1: node1 2cpu 3gb
executor2: node3 2cpu 3gb
Driver(AppMaster)根据获取到的资源信息,连接对应的节点, 通知对应nodemanager启动Executor, 并占用对应资源, nodemanager对应executor进程启动完成后, 反向注册给Driver(AppMaster)(通知已经启动成功了)
Driver(AppMaster)开始处理代码:
6.1 首先会加载所有的与RDD相关的API(算子),基于算子之间的依赖关系,形成DAG(有向无环图)执行流程图,划分stage阶段, 并且确定每个阶段应该运行多少个线程以及每个线程应该由哪个executor来执行 (任务分配)
6.2 Driver(AppMaster)程序通知对应的executor程序, 来执行具体的任务
6.3 Executor接收到任务信息后, 启动线程,开始执行处理即可: Executor咋执行的时候, 由于RDD代码中有大量的python的函数,而executor是一个JVM程序, 无法解析Python函数,此时通过调用Python解析器,执行函数, 将函数的结果返回给Executor
6.4 Executor在运行的过中, 如果发现最终的结果需要返回给Driver(AppMaster), 直接返回Driver(AppMaster)即可, 如果不需要返回, 直接输出, 结束即可
6.5 Driver(AppMaster)程序监听这个executor执行的状态信息, 当各个Executor都执行完成后, Driver(AppMaster)认为任务运行完成了
当任务执行完成后, Driver(AppMaster)执行后续的相关代码, 该打印的打印, 该关闭的执行关闭操作 一旦执行stop(), 通知RM, 程序执行完成, RM回收资源, 退出Driver(AppMaster)程序
spark-submit在提交的过程中, 设置非常多参数, 调整任务相关信息
今天给大家分享的是Pyspark基础入门2。