spark集群版原理
Spark和其他大数据框架一样,计算都需要使用资源(【core】+【内存】#core就是cpu中的几核几线程的线程数
-
1、如果只有一台服务器,那么就是使用【1台机器】的资源,一般用来做【小数据量】的测试,称之为local运行方式。
-
2、企业中使用服务器集群。
-
【资源管理器】:统筹各台机器有多少资源(有多少空闲的core和内存),统称为Cluster Manager(资源管理器),有很多框架,其中最出名的是yarn。
-
Spark程序不负责统筹资源,因为职责太繁重,Spark只委托上面的第三方Cluster Manager(资源管理器)来给自己提供资源。
-
我们编写并启动一个Spark应用程序,他需要集群的资源来跑,经常需要占用几百个CPU,几百G的内存,他找【资源管理器】申请资源。【资源管理器】手握集群资源大池子(比如数千个CPU,数T内存),spark程序向他讨一口水喝。
-
上图是2套东西叠加在一起的,一套是【资源管理器集群】,就像酒店,另一套是【Spark的运行时架构】,就像客人。客人来一波走一波,酒店一直在那儿。
- 【资源管理器集群】。
-
- 它启动后作为常驻服务,管理集群的所有【core 】+【内存 】资源。等待其他应用比如Spark应用,向自己申请资源。
- 上图Cluster Manager和Worker Node都是【抽象】泛称。
- 上图有多种具体实现,比如有【yarn】或【spark自身携带的standalone】。
- 如果具体是yarn,那么上图的抽象概念,具体就是
- ![](/i/l/?n=22&i=blog/2991602/202210/2991602-20221019144855178-170351528.png)
- hadoop包含了一套资源管理器【yarn】,这个也是企业中Spark用的最多的方式,这一套称为Spark On Yarn方式。此时的Cluster Manager就是【ResourceManager】。WorkerNode就是【NodeManager】。
- > yarn除了分配CPU内存资源给spark用,还可以分配给sqoop,hive,flink等用。
- 【仅了解,企业不用】如果具体是standalone,那么上图的抽象概念,具体就是
- ![](/i/l/?n=22&i=blog/2991602/202210/2991602-20221019144919844-677204632.png)
- 【仅了解,企业不用】Spark自带了一套资源管理器服务进程,这一套称为**standalone运行方式**,此时的cluster Manager就是【Master】进程,workerNode就是【Worker】进程。企业通常不用Spark自带的资源管理器。
- 另一套是【spark运行时架构】。
- ![](/i/l/?n=22&i=blog/2991602/202210/2991602-20221019144936579-143359342.png)
- 【Spark应用】向【资源管理器的主节点】申请资源,来启动【Spark运行时架构】。
- 其中【Executor进程】都要运行在有资源的机器上。
- 【Spark运行时架构】需要依托在【申请到的资源】上跑。
- 一个Spark程序执行完就退出,上面的运行时架构会【==销毁==】。剩下资源管理器集群继续等待其他应用来申请资源。
【重点】Spark On Yarn
快速了解Spark On Yarn的大致过程:
Spark on Yarn的本质
-
Spark On Yarn需要啥?
-
1.需要Yarn集群:已经安装了,就是上图的集群B
-
2.需要某台机器用来提交spark程序,比如上图的机器A,它安装了spark,依靠的是它的bin/目录下的spark-submit等命令。
-
机器A既可以是集群B外的机器,也可以就是集群B中的某台。企业中有钱一般是前者方式。我们课程阶段穷用后者方式,比如我们用node1当做机器A。
-
3.机器A上要有被提交的pyspark程序:如自己开发的wordcount.py
-
4.上一步的wordcount程序会将大作业拆分成多子任务,分发到集群B的各机器上运行。则集群B的各机器需要具备【Spark环境】和【python环境】。
-
5.上面说的【Spark环境】就是spark安装包/jars/目录下的200多个jar包
-
满足【spark环境】有重量级方式,和轻量级方式。
-
重量级方式就是每台机器都安装spark,不推荐。
-
轻量级方式是将spark环境的所有jar包放在HDFS目录,让需要的节点自行去找它即可,推荐。
-
6.上面第4点的【python环境】,需要集群每台机器都安装python3解释器。所以我们每台机器安装anaconda3。
-
-
总结
-
SparkOnYarn
不需要集群每台都安装Spark
只需要:Yarn集群+单机版Spark(里面有提交命令,wordcount.py等程序)
当然还要一些配置
-
配置过程(略)
测试yarn的client和cluster两种模式
- Spark客户端命令有比如【spark-shell、spark-sql、pyspark、spark-submit】
- 他们是用来提交Spark应用程序的,
- 他们都支持集群模式(也就是Spark应用跑在yarn等资源管理集群上)
- 企业通常使用spark on yarn资源管理集群
- 后面我们说的【spark集群方式】,默认就是【spark on yarn集群方式】。
- 当指定用集群方式时,需要配合指定--deploy-mode参数,表示【Driver运行在哪里】。
- 当指定为local方式时,--deploy-mode参数是没有意义的,以为local方式就一台机器。
- --deploy-mode参数只有2个值,一个是【client】模式,一个是【cluster】模式。
- Client和Cluster模式最本质的区别是:
- 1-client时,Driver程序运行在【当前提交spark应用的机器】上
- 2-cluster时,Driver程序运行在【集群中随机的空闲一个nodemanager】上。
client 模式
-
Driver 在【当前提交spark应用的机器】运行
-
如果不指定--deploy-mode,则它默认是【client】
-
计算圆周率-默认是client模式
-
SPARK_HOME=/export/server/spark ${SPARK_HOME}/bin/spark-submit \ --master yarn \ --deploy-mode client \ --driver-memory 512m \ --executor-memory 512m \ --executor-cores 1 \ --num-executors 2 \ --queue default \ --conf "spark.pyspark.driver.python=/root/anaconda3/bin/python3" \ --conf "spark.pyspark.python=/root/anaconda3/bin/python3" \ ${SPARK_HOME}/examples/src/main/python/pi.py \ 10
-
客户端【是】打印了结果值
-
-
调度执行过程
cluster 模式
-
Driver 在【集群中随机的空闲一个nodemanager】运行
-
注意:cluster 模式下,APPMaster和Driver【合为一体】了。
-
计算圆周率-cluster模式
-
${SPARK_HOME}/bin/spark-submit \ --master yarn \ --deploy-mode cluster \ --driver-memory 512m \ --executor-memory 512m \ --executor-cores 1 \ --num-executors 2 \ --queue default \ --conf "spark.pyspark.driver.python=/root/anaconda3/bin/python3" \ --conf "spark.pyspark.python=/root/anaconda3/bin/python3" \ ${SPARK_HOME}/examples/src/main/python/pi.py \ 10
-
客户端【没有】打印圆周率的值,需要去YARN的8088页面跳转到19888页面中查看。
-
以为,最后的数据都返回到driver中,而cluster模式下,driver进程不在写代码的那台客户端下面,显然,不可能打印出来嘛,要打印也是在driver机器上打印
-
yarn的client和cluster两种模式比较
Cluster和Client模式最最本质的区别是:Driver程序运行在哪里。
-
client模式:开发自测时使用
- 当程序跑起来时,Driver运行在【提交程序的节点】中
- 应用程序运行结果【会】在客户端显示,方便查看结果。
-
cluster模式:生产环境中使用该模式
- Driver程序在【某台随机空闲的NodeManager节点上】
- Spark应用的运行结果【不会】在客户端client显示,稍微不方便,
- Driver与各Executor间的通信性能【更好】。
灵魂三问:
- 为什么Spark On Yarn 时通过ApplicationMaster去向ResourceManager申请启动Executors,而不是通过Driver去干这些事情?
- 因为在Yarn集群模式中,Spark应用需要向ResourceManager申请NodeManager的资源用于启动Executor,这个职责可以让ApplicationMaster去做,而不是让Driver去做,可以让Driver更轻松,达到解耦的目的。
- 为什么用yarn-client方式可以在提交的机器上看到打印的结果,但是用yarn-cluster看不到,需要去yarn的历史日志才能看到?
- 因为用yarn-client方式,Driver进程就是启动在Client上,打印的结果显示在Client机器上。但是用yarn-cluster运行Spark程序时,Driver是某台随机的NodeManager,它就算打印了,也不会显示在当前的提交机器上,但是yarn的历史日志服务,会收集所有yarn节点的日志,所以可以在yarn的历史日志页面(yarn的node1:8088页面,点击logs,再跳转19888端口页面)中查看到程序的结果。
- 为什么企业中都使用yarn-cluster模式?
- 1、因为这种方式,使得Driver向Executor们的通信都在同一个集群的网段中(一个机房内的服务器都在一个网段),通信效率高。而反之yarn-client模式的Driver在提交的网段,Executor们在yarn集群的网段,2个网段可能不一样,通信效率低。
- 2、一般在企业中提交的机器就那么1-2台,如果大家都在同一台机器上用client模式运行各自的Spark应用,那么会造成所有的Driver进程都启动在这台机器上,造成这台机器的负担很重,造成所有的任务都受到影响。而随机的空闲的WorkerNode分散了各个Driver,负载均衡。
Spark应用架构
-
【扩展】python进程和java进程概念 java程序跑起来=java进程=jvm进程
-
下图的每个Driver或Executor,都是上面右边的jvm结构。
-
Spark应用架构就是Spark运行时架构。
-
只有Spark应用跑起来才有应用架构,如果程序退出,则消失。
-
运行中会有【4040】页面,运行完4040页面退出,只能去【18080】页面看历史。
- 【了解】如果是on yarn则4040会自动跳转到8088/proxy代理页面。
-
举例:
-
从图中可以看到一个Spark Application运行到集群上时,由两部分组成:【一个Driver进程】和【多个Executor进程】。
1、Driver
- 是一个JVM Process,它运行程序的MAIN函数,必须创建SparkContext上下文对象;
- 一个SparkApplication仅有【1】个driver;
- Driver将大的需求作业拆分成小的任务task,将task发送给executor
2、Executors
- 是一个个JVM 进程,一个JVM 进程相当于一个线程池,其中有很多线程,一个 Core 一次只运行1个线程 ,1个线程只运行【1】个Task任务,所以Executor中线程数就等于Core核数;
- 一个Spark Application可以有【多】个Executor;
- 它的功能是执行具体任务
3、Driver会将任务task发送给Executor执行。
【了解】Driver中如何将job拆分成task的过程
标签:--,Driver,yarn,base,集群,spark,Spark From: https://www.cnblogs.com/nanguyhz/p/16806266.html