基本原理
在已有 YARN 集群的前提下在单独准备 Spark StandAlone 集群,对资源的利用就不高
所以,在企业中,多数场景下,会将 Spark 运行到 YARN 集群中
- Spark On Yarn的本质
- 资源管理层面
- Master 角色由 YARN 的 ResourceManager 担任
- Worker 角色由 YARN 的 NodeManager 担任
- 任务执行层面
- Driver 角色运行在YARN容器内 或 提交任务的客户端进程中
- 真正干活的 Executor 运行在YARN提供的容器内
- 资源管理层面
- Spark On Yarn 前提
- YARN集群
- Spark客户端工具,如spark-submit, 可以将Spark程序提交到YARN中
- 被提交的代码程序:如spark/examples/src/main/python/pi.py,或自己开发的Spark任务
环境搭建
在spark-env.sh 以及 环境变量配置文件中即可:
- HADOOP_CONF_DIR
- YARN_CONF_DIR
bin/pyspark
# 启动Pyspark
bin/spark --master yarn
# 执行一行代码
sc.parallelize([1,2,3,4,5]).map(lambda x:x*10).collect()
bin/pyspark --master yarn --deploy-mode client|cluster
# --deploy-mode 选项是指定部署模式, 默认是 客户端模式
# client就是客户端模式
# cluster就是集群模式
# --deploy-mode 仅可以用在YARN模式下
注意: 交互式环境 pyspark 和 spark-shell 无法运行 cluster模式
bin/spark-shell
bin/spark-shell --master yarn --deploy-mode client|cluster
注意: 交互式环境 pyspark 和 spark-shell 无法运行 cluster模式
bin/spark-submit (PI)
bin/spark-submit --master yarn --deploy-mode client|cluster /xxx/xxx/xxx.py 参数
部署模式
Client 模式
Driver运行在YARN容器内部,和ApplicationMaster在同一个容器内
# 客户端模式启动
bin/spark-submit \
--master yarn \
--deploy-mode client \ # Client模式
--driver-memory 512m \
--executor-memory 512m \
--num-executors 3 \
--total-executor-cores 3 \
/hadoop/software/spark/examples/src/main/python/pi.py 100
# 终端有日志输出
- Driver在任务提交的本地机器上运行,Driver启动后会和ResourceManager通讯申请启动ApplicationMaster
- 随后ResourceManager分配Container,在合适的NodeManager上启动ApplicationMaster,此时的ApplicationMaster的功能相当于一个ExecutorLaucher,只负责向ResourceManager申请Executor内存;
- ResourceManager接到ApplicationMaster的资源申请后会分配Container,然后ApplicationMaster在资源分
配指定的NodeManager上启动Executor进程; - Executor进程启动后会向Driver反向注册,Executor全部注册完成后Driver开始执行main函数;
- 之后执行到Action算子时,触发一个Job,并根据宽依赖开始划分Stage,每个Stage生成对应的TaskSet,之后将Task分发到各个Executor上执行。
Cluster 模式
Driver运行在客户端进程中,比如Driver运行在spark-submit程序的进程中
# Cluster模式启动
bin/spark-submit \
--master yarn \
--deploy-mode cluster \ # Cluster模式
--driver-memory 512m \
--executor-memory 512m \
--num-executors 3 \
--total-executor-cores 3 \
/hadoop/software/spark/examples/src/main/python/pi.py 100
# 客户端上没有日志输出
- 任务提交后会和ResourceManager通讯申请启动ApplicationMaster;
- 随后ResourceManager分配Container,在合适的NodeManager上启动ApplicationMaster,此时的ApplicationMaster就是Driver
- Driver启动后向ResourceManager申请Executor内存,ResourceManager接到ApplicationMaster的资源申请后会分配Container,然后在合适的NodeManager上启动Executor进程
- Executor进程启动后会向Driver反向注册
- Executor全部注册完成后Driver开始执行main函数,之后执行到Action算子时,触发一个job,并根据宽依赖开始划分stage,每个stage生成对应的taskSet,之后将task分发到各个Executor上执行;
二者区别
Client 模式和 Cluster 模式最最本质的区别是:Driver程序运行在哪里
- Client 模式
- 学习测试时使用,生产不推荐(要用也可以,性能略低,稳定性略低)
- Driver 运行在 Client 上,和集群的通信成本高
- Driver 输出结果会在客户端显示
- Cluster 模式
- 生产环境中使用该模式
- Driver 程序在 YARN 集群中,和集群的通信成本低
- Driver输出结果不能在客户端显示
- 该模式下Driver运行ApplicattionMaster这个节点上,由Yarn管理
- 如果出现问题,yarn会重启ApplicattionMaster(Driver)
SparkOnYarn 本质是什么?
- Master由ResourceManager代替
- Worker由NodeManager代替
- Driver可以运行在容器内(Cluster模式)或客户端进程中(Client模式)
- Executor全部运行在YARN提供的容器内
Why Spark On YARN?
- 提高资源利用率,在已有YARN的场景下让Spark收到YARN的调度可以更好的管控
资源提高利用率并方便管理
评论区