需要一些运行时说明。
在我阅读过的其他文章中,有人指出Spark Executor应该只分配一个Core。但是,我想知道这是否真的是真的。在阅读了诸如此类的各种SO问题以及Karau,Wendell等人的文章后,很显然,平等和相对的专家指出,在某些情况下,一个人应该为每个执行者指定更多的Cores,但是讨论的趋势往往更多技术胜于功能。也就是说,缺少功能示例。
我的理解是,RDD或DF,DS的分区由单个执行程序提供服务。很好,没有问题,很合情理。那么,分区如何从多个内核中受益?
如果我有一个 map 后跟一个 filter ,则这不是两个可以交错的任务-正如Informatica所做的那样,我的理解是它们融合在一起。既然如此,那么分配给执行器运行更多内核的好处又是什么呢?
来自JL:换句话说,“任务”是对Spark Job中RDD阶段中RDD分区中记录的计算。在实践中从功能上讲是什么意思?
此外,如果不是所有内核都可以获取,可以分配执行器吗?我认为有一个等待期,过了一会儿,它可能会以更有限的容量分配。是吗?
从对SO What is a task in Spark? How does the Spark worker execute the jar file?的高度评价中得出以下结论:创建SparkContext时,每个工作人员都会启动一个执行程序。关于另一个SO问题:创建SparkContext时,每个工作程序节点都会启动一个执行程序。
不确定我是否遵循这些主张。如果Spark不预先知道分区数等,为什么要这么早分配执行器?
我问这个问题,因为即使这篇出色的帖子How are stages split into tasks in Spark?也没有给出每个执行者多个内核的实际示例。我可以清楚地跟踪该帖子,它与我对每个执行者1个核心的理解相符。
答案 0 :(得分:1)
我的理解是,分区(...)由单个执行程序提供服务。
是正确的,但事实并非如此-单个执行程序可以处理多个阶段甚至多个RDD的多个分区/任务。
那么,指派的执行器运行更多内核会带来什么好处呢?
首先要同时处理多个任务。由于每个执行程序都是一个单独的JVM,这是一个相对繁重的过程,因此最好为多个线程仅保留实例。此外,它还可以提供其他优点,例如公开可以在多个任务之间使用的共享内存(例如,store broadcast variables)。
当用户调用多线程代码时,辅助应用程序将多个线程应用于单个分区。但是,默认情况下(Number of CPUs per Task in Spark)不会这样做
另请参阅What are the benefits of running multiple Spark tasks in the same JVM?
如果Spark事先不知道分区数等,为什么要这么早分配执行器?
通过扩展以上观点,相当多-执行程序不是为处理特定任务/分区而创建的。进程运行很长时间,并且只要不启用动态分配,就可以在相应应用程序/驱动程序的整个生命周期中持续有效(抢占或失败以及已经提到的动态分配可能会影响这一点,但这就是基本模型)。