spark篇---spark中资源调度源码分析与应用

L先生AI课堂 L先生AI课堂     2022-10-14     555

关键词:

一、前述

Spark中资源调度是一个非常核心的模块,尤其对于我们提交参数来说,需要具体到某些配置,所以提交配置的参数于源码一一对应,掌握此节对于Spark在任务执行过程中的资源分配会更上一层楼。由于源码部分太多本节只抽取关键部分和结论阐述,更多的偏于应用。

二、具体细节

 

1、Spark-Submit提交参数

Options:

  • --master

 MASTER_URL, 可以是spark://host:port, mesos://host:port, yarn,  yarn-cluster,yarn-client, local

 

  • --deploy-mode

DEPLOY_MODE, Driver程序运行的地方,client或者cluster,默认是client。

 

  • --class

CLASS_NAME, 主类名称,含包名

 

  • --jars

  逗号分隔的本地JARS, Driverexecutor依赖的第三方jar包(Driver是把算子中的逻辑发送到executor中去执行,所以如果逻辑需要依赖第三方jar包 比如oreacl的包时 这里用--jars添加)

 

  • --files

用逗号隔开的文件列表,会放置在每个executor工作目录

 

  • --conf

spark的配置属性

 

  • --driver-memory

Driver程序使用内存大小(例如:1000M,5G),默认1024M

 

  • --executor-memory

每个executor内存大小(如:1000M,2G),默认1G

 

Spark standalone with cluster deploy mode only:

  • --driver-cores

Driver程序的使用core个数(默认为1仅限于Spark standalone模式

 

Spark standalone or Mesos with cluster deploy mode only:

  • --supervise

失败后是否重启Driver,仅限于Spark  alone或者Mesos模式

 

Spark standalone and Mesos only:

  • --total-executor-cores

executor使用的总核数,仅限于SparkStandalone、Spark on Mesos模式

 

Spark standalone and YARN only:

  • --executor-cores

每个executor使用的core数,Spark on Yarn默认为1standalone默认为worker上所有可用的core。

 

YARN-only:

  • --driver-cores

driver使用的core,仅在cluster模式下,默认为1。

  • --queue

QUEUE_NAME  指定资源队列的名称,默认:default

  • --num-executors

一共启动的executor数量,默认是2个

 

2、资源调度源码分析

 

  • 资源请求简单图

 

 

  • 资源调度Master路径:

      

         路径:spark-1.6.0/core/src/main/scala/org.apache.spark/deploy/Master/Master.scala

 

  • 提交应用程序,submit的路径:

       

         路径:spark-1.6.0/core/src/main/scala/org.apache.spark/ deploy/SparkSubmit.scala

  • 总结:
  1. Executor在集群中分散启动,有利于task计算的数据本地化。
  2. 默认情况下(提交任务的时候没有设置--executor-cores选项),每一个Worker为当前的Application启动一个Executor,这个Executor会使用这个Worker的所有的cores和1G内存。
  3. 如果想在Worker上启动多个Executor,提交Application的时候要加--executor-cores这个选项。
  4. 默认情况下没有设置--total-executor-cores,一个Application会使用Spark集群中所有的cores。设置多少个用多少。

 

  • 结论演示

        集群中总资源如下:

  •  

              使用Spark-submit提交任务演示。也可以使用spark-shell

 

           2.1、默认情况每个worker为当前的Application启动一个Executor,这个Executor使用集群中所有的cores1G内存。

           ./spark-submit --master spark://node01:7077  --class org.apache.spark.examples.SparkPi ../lib/spark-examples-1.6.0-hadoop2.6.0.jar 10000

 

         2.2、workr上启动多个Executor,设置--executor-cores参数指定每个executor使用的core数量。

        ./spark-submit --master spark://node01:7077 --executor-cores 1 --class org.apache.spark.examples.SparkPi ../lib/spark-examples-1.6.0-hadoop2.6.0.jar 10

 

 

           2.3、内存不足的情况下启动core的情况。Spark启动是不仅看core配置参数,也要看配置的core的内存是否够用。

          ./spark-submit --master spark://node01:7077 --executor-cores 1 --executor-memory 3g --class org.apache.spark.examples.SparkPi ../lib/spark-examples-1.6.0-hadoop2.6.0.jar 10000

            可见并没有启动起来,因为内存不够。。。

            ./spark-submit --master spark://node01:7077 --executor-cores 1 --executor-memory 2g --class org.apache.spark.examples.SparkPi ../lib/spark-examples-1.6.0-hadoop2.6.0.jar 10000

 

           2.4、--total-executor-cores集群中共使用多少cores

           注意:一个进程不能让集群多个节点共同启动。

          ./spark-submit --master spark://node01:7077 --executor-cores 1 --executor-memory 2g --total-executor-cores 3 --class org.apache.spark.examples.SparkPi ../lib/spark-examples-1.6.0-hadoop2.6.0.jar 10000

 

 

         ./spark-submit --master spark://node01:7077 --executor-cores 1 --executor-memory 1g --total-executor-cores 3 --class org.apache.spark.examples.SparkPi ../lib/spark-examples-1.6.0-hadoop2.6.0.jar 200

          ./spark-submit --master spark://node01:7077 --executor-cores 1 --executor-memory 2g --total-executor-cores 3 --class org.apache.spark.examples.SparkPi ../lib/spark-examples-1.6.0-hadoop2.6.0.jar 200

         注意:生产环境中一定要加上资源的配置  因为Spark是粗粒度调度资源框架,不指定的话,默认会消耗所有的cores!!!!

 

 

3 、任务调度源码分析

 

  • Action算子开始分析

 

                 任务调度可以从一个Action类算子开始。因为Action类算子会触发一个job的执行。

 

  • 划分stage,以taskSet形式提交任务

 

                DAGScheduler 类中getMessingParentStages()方法是切割job划分stage。可以结合以下这张图来分析:

 

spark资源调度机制源码分析--基于spreadoutapps及非spreadoutapps两种资源调度算法

Spark资源调度机制源码分析--基于spreadOutApps及非spreadOutApps两种资源调度算法1、spreadOutApp尽量平均分配到每个executor上;2、非spreadOutApp尽量在使用单个executor的资源。 源码分析org.apache.spark.deploy.master.Master1、首先判断,master状... 查看详情

spark学习之资源调度

...行计划和物理执行计划,今天我们主要来学习spark的资源调度的内容,对往期内容感兴趣的同学可以参考如下内容👇:上一篇:spark学习之执行计划explain.hadoop专题:hadoop系列文章.spark专题:spark系列文章.flin 查看详情

spark学习之资源调度

...行计划和物理执行计划,今天我们主要来学习spark的资源调度的内容,对往期内容感兴趣的同学可以参考如下内容👇:上一篇:spark学习之执行计划explain.hadoop专题:hadoop系列文章.spark专题:spark系列文章.flin 查看详情

spark中资源调度任务调度

在spark的资源调度中1、集群启动worker向master汇报资源情况2、Client向集群提交app,向master注册一个driver(需要多少core、memery),启动一个driver3、Driver将当前app注册给master,(当前app需要多少资源),并请求启动对应的Executor4、drive... 查看详情

spark调研笔记第3篇-spark集群相应用的调度策略简单介绍

...两种情况,下文分别进行说明。1.应用间调度1)调度策略1:资源静态分区资源静态分区是指整个集群的资源被预先划分为多个partitions,资源分配时的最小粒度是一个静态的partition。依据应用对资源的申请需求为其分配静态的partitio... 查看详情

spark调研笔记第3篇-spark集群对应用的调度策略简介

...情况,下文分别进行说明。1.应用间调度1)调度策略1:资源静态分区资源静态分区是指整个集群的资源被预先划分为多个partitions,资源分配时的最小粒度是一个静态的partition。根据应用对资源的申请需求为其分配静态的part... 查看详情

大数据篇:oozie与spark2整合进行资源调度(代码片段)

文章目录1.oozie资源调度1.1oozie概览1.2oozie与spark2整合1.2.1oozie添加spark2依赖库1.2.2打包与提交spark2jar,创建spark2工作流1.2.3管理与查看工作流相关状态1.3oozieworkflow/schedules/bundles1.4配置可能会遇到的一些问题前言:Oozie是Hadoop平台... 查看详情

spark核心原理(核心篇二)

...tor代码SparkContext:Spark应用程序的入口,负责调度各个运算资源,协调各个WorkerNode上的ExecutorDriver: Spark中的Driver即运行上述Application的main函数并创建SparkContext,创建SparkContext的目的是为了准备Spark应用程序的运行环境,在Spark... 查看详情

spark学习之sparksql语法优化

🐹上一章的学习中,我们学习了spark的资源调度进行了学习,今天我们要学习的内容是sparksql语法优化部分,对往期内容感兴趣的同学可以参考👇:上一篇:spark学习之资源调度.上一篇:spark学习之执行计划explain.h... 查看详情

《深入理解spark:核心思想与源码分析》——sparkcontext的初始化(中)

《深入理解Spark:核心思想与源码分析》一书前言的内容请看链接《深入理解SPARK:核心思想与源码分析》一书正式出版上市《深入理解Spark:核心思想与源码分析》一书第一章的内容请看链接《第1章环境准备》《深入理解Spark:... 查看详情

大数据篇:oozie与spark2整合进行资源调度(代码片段)

文章目录1.oozie资源调度1.1oozie概览1.2oozie与spark2整合1.2.1oozie添加spark2依赖库1.2.2打包与提交spark2jar,创建spark2工作流1.2.3管理与查看工作流相关状态1.3oozieworkflow/schedules/bundles1.4配置可能会遇到的一些问题前言:Oozie是Hadoop平台... 查看详情

spark学习之sparksql语法优化(代码片段)

🐹上一章的学习中,我们学习了spark的资源调度进行了学习,今天我们要学习的内容是sparksql语法优化部分,对往期内容感兴趣的同学可以参考👇:上一篇:spark学习之资源调度.上一篇:spark学习之执行计划explain.h... 查看详情

spark系列master中的资源调度

资源调度说明:Application的调度算法有两种,分别为spreadOutApps和非spreadOutAppsspreadOutApps在spark-submit脚本中,可以指定要多少个executor,executor需要多少个cpu及多少内存,基于该机制,最后executor的实际数量,以及每个executor的cpu可能... 查看详情

spark源码阅读--shuffle读过程源码分析(代码片段)

shuffle读过程源码分析上一篇中,我们分析了shuffle在map阶段的写过程。简单回顾一下,主要是将ShuffleMapTask计算的结果数据在内存中按照分区和key进行排序,过程中由于内存限制会溢写出多个磁盘文件,最后会对所有的文件和内... 查看详情

spark资源调度(代码片段)

一:任务调度和资源调度的区别:任务调度是指通过DAGScheduler,TaskScheduler,SchedulerBackend完成的job的调度资源调度是指应用程序获取资源的调度,他是通过schedule方法完成的二:资源调度解密因为master负责资源管理和调度,所以资... 查看详情

spark性能优化指南——高级篇

...基础篇讲解了每个Spark开发人员都必须熟知的开发调优与资源调优之后,本文作为《Spark性能优化指南》的高级篇,将深入分析数据倾斜调优与shuffle调优,以解决更加棘手的性能问题。调优概述有的时候,我们可能会遇到大数据... 查看详情

spark性能优化指南——高级篇

...基础篇讲解了每个Spark开发人员都必须熟知的开发调优与资源调优之后,本文作为《Spark性能优化指南》的高级篇,将深入分析数据倾斜调优与shuffle调优,以解决更加棘手的性能问题。数据倾斜调优调优概述有的时候,我们可能... 查看详情

spark源代码分析之六:task调度

    话说在《Spark源代码分析之五:Task调度(一)》一文中,我们对Task调度分析到了DriverEndpoint的makeOffers()方法。这种方法针对接收到的ReviveOffers事件进行处理。代码例如以下://Makefakeresourceoffersonallexecutors ... 查看详情