Scheduling 在独立模式下,哪些因素决定了执行者的数量?

Scheduling 在独立模式下,哪些因素决定了执行者的数量?,scheduling,apache-spark,Scheduling,Apache Spark,给一个火花应用 在独立模式下,哪些因素决定了执行者的数量?在Mesos和纱线中,根据文件,我们可以指定执行器/核心和内存的数量 一旦启动了多个执行器。Spark是否以循环方式启动任务,或者是否足够聪明,可以查看一些执行者是否空闲/忙碌,然后相应地安排任务 另外,Spark如何决定任务的数量?我用小数据集做了一个简单的最高温度程序,Spark在一个执行器中产生了两个任务。这是Spark单机模式 Spark根据原始数据集中的分区数选择任务数。如果使用HDFS作为数据源,则默认情况下,具有的分区数应等

给一个火花应用

  • 在独立模式下,哪些因素决定了执行者的数量?在Mesos和纱线中,根据文件,我们可以指定执行器/核心和内存的数量

  • 一旦启动了多个执行器。Spark是否以循环方式启动任务,或者是否足够聪明,可以查看一些执行者是否空闲/忙碌,然后相应地安排任务

  • 另外,Spark如何决定任务的数量?我用小数据集做了一个简单的最高温度程序,Spark在一个执行器中产生了两个任务。这是Spark单机模式


  • Spark根据原始数据集中的分区数选择任务数。如果使用HDFS作为数据源,则默认情况下,具有的分区数应等于HDFS块数。您可以通过多种不同的方式更改分区的数量。前两个:作为
    SparkContext.textFile
    方法的额外参数;通过调用
    RDD.repartion
    方法。

    回答您的问题:

  • 独立模式使用与Mesos和纱线模式相同的配置变量来设置执行器的数量。变量
    spark.cores.max
    定义spark上下文中使用的最大内核数。默认值为无穷大,因此Spark将使用群集中的所有核心。spark.task.cpus变量定义spark将为单个任务分配多少CPU,默认值为1。通过这两个变量,您可以定义集群中并行任务的最大数量

  • 创建RDD子类时,可以定义在哪些机器上运行任务。这是在
    getPreferredLocations
    方法中定义的。但是由于方法签名表明这只是一个首选项,因此如果Spark检测到一台机器不忙,它将在这台空闲机器中启动任务。然而,我不知道Spark使用什么机制来知道哪些机器处于空闲状态。为了实现局部性,我们(Stratio)决定将每个部分都缩小,这样任务所需的时间更少,并实现局部性

  • 每个Spark操作的任务数是根据RDD分区的长度定义的。这个向量是getPartitions方法的结果,如果您想开发一个新的RDD子类,就必须重写该方法。此方法返回RDD的拆分方式、信息的位置和分区。当您使用(例如)联合或联接操作联接两个或多个RDD时,生成的RDD的任务数是该操作中涉及的RDD的最大任务数。例如:如果您加入具有100个任务的RDD1和具有1000个任务的RDD2,则生成的RDD的下一个操作将具有1000个任务。请注意,大量分区不一定是更多数据的同义词


  • 我希望这会有所帮助。

    我同意@jlopezmat关于Spark如何选择其配置的观点。关于测试代码,由于
    textFile
    的实现方式,您将看到两个任务。从
    SparkContext.scala

      /**
       * Read a text file from HDFS, a local file system (available on all nodes), or any
       * Hadoop-supported file system URI, and return it as an RDD of Strings.
       */
      def textFile(path: String, minPartitions: Int = defaultMinPartitions): RDD[String] = {
        hadoopFile(path, classOf[TextInputFormat], classOf[LongWritable], classOf[Text],
          minPartitions).map(pair => pair._2.toString)
      }
    
    如果我们检查
    defaultMinPartitions
    的值是多少:

      /** Default min number of partitions for Hadoop RDDs when not given by user */
      def defaultMinPartitions: Int = math.min(defaultParallelism, 2)
    

    回答之前的回答中未提及的一些问题:

    • 在独立模式下,您需要使用
      --executor cores
      --max executor cores
      设置将启动的执行器的数量(如果您指定
      --executor memory
      ,则您有足够的内存容纳该数量)

    • Spark不以循环方式分配任务,它使用一种称为“”的机制,这是一种基于拉动的技术,允许每个执行器向主控器提供其可用性,主控器将决定是否向其发送任务


    谢谢Daniel-当我从HDFS加载小文件时,分区的数量默认为两个(RDD.getNumPartitions()),如您所述。因此,启动了两个任务,每个分区一个,HDFS中有两个文件。我做了一个合并(1),输出中的文件数是1。我放了一个包含5个块的文件,看到5个任务是Spark。看起来一个块创建了两个分区。对于多个块,将创建相同数量的分区。尽管设置num executors参数,独立模式始终使用一个executor。显然,spark standalone会忽略spark.cores.max设置