这里重点还是总结一下Standalone模式和yarn模式的资源调度和任务调度

资源调度:

资源调度是指我们在集群中寻找运行节点的过程,一个每个worker需要使用心跳机制向master汇报自己的状态,master了解情况后,当有个应用提交时,就会使用某个算法来根据资源分配哪些节点来做这个应用。

任务调度:

当资源调度之后,我们的Driver会将一个应用分开,比如之前说过的RDD,当一个job过来了,会根据宽窄依赖划分成stage,每一个stage划分成几个task,分配交给worker执行。

Standalone

client模式

提交命令

//这里只是做了一个样例,使用了spark里面自带的样例jar包
./spark-submit 
--master spark://hadoop01:7077 
--class org.apache.spark.examples.SparkPi 
../lib/spark-examples-1.6.0-hadoop2.6.0.jar 
1000
//或者
./spark-submit 
--master spark://hadoop01:7077 
--deploy-mode client 
--class org.apache.spark.examples.SparkPi 
../lib/spark-examples-1.6.0-hadoop2.6.0.jar 
1000

Spark的动态资源分配 spark 资源调度_hadoop

  1. client模式提交任务后,会在客户端启动Driver进程。
  2. Driver会向Master申请启动Application启动的资源。
  3. 资源申请成功,Driver端将task发送到worker端执行。
  4. worker将task执行结果返回到Driver端。

但是这个只适合那种少数应用的测试,不适于生产环境,生产环境动不动就几百个几千个应用提交,这样很多Driver都在client端运行,网络流量卡点,Driver也负载不过来。

 

于是用cluster模式

cluster模式

./spark-submit 
--master spark://node1:7077 
--deploy-mode cluster
--class org.apache.spark.examples.SparkPi 
../lib/spark-examples-1.6.0-hadoop2.6.0.jar 
100

Spark的动态资源分配 spark 资源调度_hadoop_02

从这里可以看出,这个Driver是在集群中的某一个Work从节点运行的,所以对于客户端client如果提交多个应用,Master会根据work节点的资源情况来在不同的worker启动Driver,分摊了负载,还平均了网络流量。

  1. cluster模式提交应用程序后,会向Master请求启动Driver.
  2. Master接受请求,随机在集群一台节点启动Driver进程。
  3. Driver启动后为当前的应用程序申请资源。
  4. Driver端发送task到worker节点上执行。
  5. worker将执行情况和执行结果返回给Driver端。

 

基于Yarn

 

client

./spark-submit 
--master yarn
 --class org.apache.spark.examples.SparkPi ../lib/spark-examples-1.6.0-hadoop2.6.0.jar
100

./spark-submit 
--master yarn–client
 --class org.apache.spark.examples.SparkPi ../lib/spark-examples-1.6.0-hadoop2.6.0.jar
100

./spark-submit 
--master yarn 
--deploy-mode  client 
 --class org.apache.spark.examples.SparkPi ../lib/spark-examples-1.6.0-hadoop2.6.0.jar
100

Spark的动态资源分配 spark 资源调度_spark_03

要注意的,与standaline不同的是,整个资源的分配调度是由Yarn控制的,

 

  1. 客户端提交一个Application,在客户端启动一个Driver进程。
  2. 应用程序启动后会向RS(ResourceManager)发送请求,启动AM(ApplicationMaster)的资源。
  3. RS收到请求,随机选择一台NM(NodeManager)启动AM。这里的NM相当于Standalone中的Worker节点。
  4. AM启动后,会向RS请求一批container资源,用于启动Executor.
  5. RS会找到一批NM返回给AM,用于启动Executor。
  6. AM会向NM发送命令启动Executor。
  7. Executor启动后,会反向注册给Driver,Driver发送task到Executor,执行情况和结果返回给Driver端。
  • ApplicationMaster的作用:
  1. 为当前的Application申请资源
  2. 给NameNode发送消息启动Executor。

注意:ApplicationMaster有launchExecutor和申请资源的功能,并没有作业调度的功能。

 

cluster

./spark-submit 
--master yarn 
--deploy-mode cluster 
--class org.apache.spark.examples.SparkPi ../lib/spark-examples-1.6.0-hadoop2.6.0.jar
100


./spark-submit 
--master yarn-cluster
--class org.apache.spark.examples.SparkPi ../lib/spark-examples-1.6.0-hadoop2.6.0.jar
100

Spark的动态资源分配 spark 资源调度_spark_04

 

  1. 客户机提交Application应用程序,发送请求到RS(ResourceManager),请求启动AM(ApplicationMaster)。
  2. RS收到请求后随机在一台NM(NodeManager)上启动AM(相当于Driver端)。
  3. AM启动,AM发送请求到RS,请求一批container用于启动Executor。
  4. RS返回一批NM节点给AM。
  5. AM连接到NM,发送请求到NM启动Executor。
  6. Executor反向注册到AM所在的节点的Driver。Driver发送task到Executor。

Yarn-Cluster主要用于生产环境中,因为Driver运行在Yarn集群中某一台nodeManager中,每次提交任务的Driver所在的机器都是随机的,不会产生某一台机器网卡流量激增的现象,缺点是任务提交后不能看到日志。只能通过yarn查看日志。

  • ApplicationMaster的作用:
  1. 为当前的Application申请资源
  2. 给NameNode发送消息启动Excutor。
  3. 任务调度。这是因为Driver和ApplicationManager在同一个节点
  • 停止集群任务命令:yarn application -kill applicationID

 

 

 

详细过程

 

 

Spark的动态资源分配 spark 资源调度_spark_05