Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 线程池(在驱动程序上)和执行器内核之间的关系是什么?_Scala_Apache Spark - Fatal编程技术网

Scala 线程池(在驱动程序上)和执行器内核之间的关系是什么?

Scala 线程池(在驱动程序上)和执行器内核之间的关系是什么?,scala,apache-spark,Scala,Apache Spark,我正在尝试使用scala的Futures API运行一个进程,以并行运行某些操作。下面是一个示例代码片段 import scala.util._ import scala.concurrent._ import scala.concurrent.ExecutionContext.Implicits.global object ConcurrentContext { def def appMain(args: Array[String]) = { // configure spark val

我正在尝试使用scala的Futures API运行一个进程,以并行运行某些操作。下面是一个示例代码片段

import scala.util._
import scala.concurrent._
import scala.concurrent.ExecutionContext.Implicits.global

object ConcurrentContext {
  def def appMain(args: Array[String]) = {
// configure spark
val spark = SparkSession
    .builder
    .appName("parjobs")
    .getOrCreate()

val pool = Executors.newFixedThreadPool(5)
   // create the implicit ExecutionContext based on our thread pool
implicit val xc = ExecutionContext.fromExecutorService(pool)

 /** Wraps a code block in a Future and returns the future */
def executeAsync[T](f: => T): Future[T] = {
Future(f)
}
} 
我的问题是:-

  • 如果我将executor cores的值设置为4,控制每个executor JVM的线程数,并在应用程序内创建一个5个线程池,那么哪个线程池优先

  • 如果我没有显式设置线程池,那么默认的
    ExecutionContext
    将基于启动进程的机器上存在的所有内核(将是驱动程序)创建一个默认线程池,在这种情况下,executor core属性会有何影响

  • 如果线程池值优先于executor core,并且如果我使用默认值,那么每个JVM是否有可能有多个线程(相当于CPU核心)

  • 如果我将executor cores的值设置为4,它控制每个executor JVM的线程数,并在应用程序内创建一个5个线程池

    执行Spark应用程序时,您有驱动程序和一个或多个执行器。为了简单起见,假设您只有一个执行者

    您有4个CPU用于执行器

    使用4个CPU可以并行运行多少任务?完全正确

    该驱动程序在Spark应用程序中具有5个线程的线程池的部分中运行。为了简单起见,我们假设使用了所有5个

    你能安排多少工作?5个正是

    每个Spark作业都可以有一个或多个阶段,其中包含一个或多个分区,以便使用任务进行处理。为了简单起见,让我们假设所有5个Spark作业都有一个带有1个分区的阶段(这是不太可能的,但只是为了让您了解Spark的工作原理,它应该可以)

    记住,一个分区就是一个任务

    Spark应用程序将提交多少任务?5个作业,每个作业有1个任务,每个作业有5个任务

    在5-CPU executor上执行所有5个任务需要多少时间?1个时隙(无论“时隙”是什么意思)

    这是executor cores/CPU与驱动程序上5个线程的线程池之间的关系

    如果我没有显式设置线程池,那么默认ExecutionContext将基于启动进程的机器上存在的所有内核(将是驱动程序)创建一个默认线程池,在这种情况下,executor core属性会产生什么影响

    我认为以上部分也回答了这个问题

    如果线程池值优先于executor core,并且如果我使用默认值,那么每个JVM是否有可能有多个线程(相当于CPU核心)


    它也是。正确吗?

    请记住,未来迫在眉睫……您使用
    SparkSession
    设置的属性(包括
    spark.executor.cores
    )只会影响spark在分布式数据结构(RDD、DataFrame、Dataset)上执行的任务的并行性。你所做的一切,都是在驱动机器上,独立于Spark;你可以使用线程池等来控制它的并行性@EmiCareOfCell44-你能解释一下“未来迫在眉睫”是什么意思吗,也许可以helpful@suj1th-我想我明白你的意思了,主驱动程序JVM将基于线程池生成多个线程,每个线程都可以访问相同的Spark上下文,以便在将来并行运行多个调用。我的理解正确吗?