【问题标题】:Number of Executor Cores and benefits or otherwise - Spark执行器核心的数量和好处或其他 - Spark
【发布时间】:2019-01-24 21:38:07
【问题描述】:

要求进行一些运行时说明。

在我阅读的其他地方的一个线程中,有人说 Spark 执行器应该只分配一个核心。但是,我想知道这是否真的总是如此。阅读各种 SO 问题等,以及 Karau、Wendell 等人,很明显,有平等和相反的专家表示在某些情况下应该为每个 Executor 指定更多的核心,但讨论往往更多技术大于功能。也就是说,缺少功能性的例子。

  • 我的理解是,RDD 或 DF、DS 的分区由单个 Executor 提供服务。好吧,没问题,完全有道理。那么,Partition 如何从多个 Core 中受益呢?

    • 如果我有一个 map,然后是一个 filter,这不是两个可以交错的任务 - 就像 Informatica 所做的那样,如我的理解是它们融合在一起。既然如此,那么分配的 Executor 运行更多 Core 的好处是什么?

    • 来自 JL:换句话说,任务是对 Spark 作业中 RDD 阶段中 RDD 分区中记录的计算。从功能上讲,在实践中是什么意思?

  • 另外,如果不能获取所有Cores,是否可以分配Executor?我认为有一个等待期,一段时间后它可能会以更有限的容量分配。是吗?

  • 从对 SO 的高度评价答案What is a task in Spark? How does the Spark worker execute the jar file? 中陈述如下:当您创建 SparkContext 时,每个工作人员都会启动一个执行程序。来自另一个 SO 问题:创建 SparkContext 时,每个工作节点都会启动一个执行程序。

    不确定我是否遵循这些断言。如果 Spark 事先不知道分区数量等,为什么这么早就分配 Executor?

我问这个问题,因为即使是这篇出色的帖子 How are stages split into tasks in Spark? 也没有给出每个执行器多个核心的实际示例。我可以清楚地遵循帖子,它符合我对每个执行器 1 个核心的理解。

【问题讨论】:

    标签: apache-spark


    【解决方案1】:

    我的理解是一个分区(...)由单个 Executor 服务。

    没错,但反之则不然——单个 executor 可以跨多个阶段甚至多个 RDD 处理多个分区/任务。

    那么从分配的 Executor 运行更多核心中受益的示例是什么?

    首先同时处理多个任务。由于每个执行程序都是一个单独的 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事先不知道分区数量等,为什么要这么早分配Executor呢?

    几乎可以扩展上述观点 - 执行程序不是为了处理特定任务/分区而创建的。有长时间运行的进程,只要未启用动态分配,就会持续相应应用程序/驱动程序的整个生命周期(抢占或失败,以及已经提到的动态分配,都会影响这一点,但那是基本模型)。

    【讨论】:

    • 2 个执行器 - 2 个 JVM,1 个执行器 1 个 JVM,给定 JVM 开销和 Spark 簿记实用程序很容易 1GB RAM 用于空闲的 executor.JVM。
    猜你喜欢
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    • 2017-01-02
    相关资源
    最近更新 更多