apache-spark - 执行器核心的数量和好处或其他 - Spark
问题描述
要求进行一些运行时说明。
在我读到的其他地方的一个线程中,有人说 Spark 执行器应该只分配一个核心。但是,我想知道这是否真的总是如此。阅读各种 SO 问题等,以及 Karau、Wendell 等人,很明显,有平等和相反的专家表示在某些情况下应该为每个 Executor 指定更多的核心,但讨论往往更多技术大于功能。也就是说,缺少功能示例。
我的理解是,RDD 或 DF、DS 的分区由单个 Executor 提供服务。好吧,没问题,完全有道理。那么,Partition 如何从多个 Core 中受益呢?
如果我有一个map后跟一个filter,这不是两个可以交错的任务 - 正如 Informatica 所做的那样,因为我的理解是它们融合在一起。既然如此,那么从分配的 Executor 运行更多核心中受益的例子是什么?
来自 JL:换句话说,任务是对 Spark Job 中 RDD 阶段中 RDD 分区中记录的计算。从功能上讲,在实践中是什么意思?
而且,如果不是所有的Cores都可以获取,Executor可以分配吗?我认为有一个等待期,一段时间后它可能会以更有限的容量分配。真的?
从对 SO 的高度评价答案中,Spark 中的任务是什么?Spark worker 是如何执行 jar 文件的?,说明如下:当你创建 SparkContext 时,每个 worker 都会启动一个 executor。来自另一个 SO 问题:创建 SparkContext 时,每个工作节点都会启动一个执行程序。
不确定我是否遵循这些断言。如果 Spark 事先不知道分区数量等,为什么要这么早分配 Executor?
我问这个,因为即使是这篇优秀的帖子How are stages split into tasks in Spark? 没有给出每个执行器多个核心的实际示例。我可以清楚地遵循这篇文章,它符合我对每个执行者 1 个核心的理解。
解决方案
我的理解是由单个执行器服务的分区(...)。
这是正确的,但相反的情况并非如此——单个执行器可以跨多个阶段甚至多个 RDD 处理多个分区/任务)。
那么从分配的执行器运行更多核心中受益的例子是什么?
首先是同时处理多个任务。由于每个执行程序都是一个单独的 JVM,这是一个相对繁重的进程,因此最好只保留多个线程的实例。此外,它还可以提供更多优势,例如公开可跨多个任务使用的共享内存(例如存储广播变量)。
当用户调用多线程代码时,辅助应用程序将多个线程应用于单个分区。然而,这不是默认完成的(Spark 中每个任务的 CPU 数量)
另请参阅在同一个 JVM 中运行多个 Spark 任务有什么好处?
如果 Spark 事先不知道分区数量等,为什么要这么早分配 Executor?
几乎可以扩展上述观点 - 执行程序不是为了处理特定任务/分区而创建的。有长时间运行的进程,只要不启用动态分配,就会持续相应应用程序/驱动程序的整个生命周期(抢占或失败,以及已经提到的动态分配,都会影响这一点,但那是基本模型)。
推荐阅读
- typescript - TypeScript:错误 TS2322:类型“{}”不可分配给类型“...”
- php - 使用 Darksky Weather API 在 Laravel 中找不到类“Darksky\Darksky”?
- sas - 合并 2 个 SAS 数据集,得到 0 个观测值
- python - Python + Kivy(第二个屏幕加载空白)
- ms-access - BrowseTo MacroAction 不接受用户对 Where 子句的输入
- laravel - -ve 值到 .blade.php {{}}
- javascript - 仅在提交按下但在 JavaScript/jQuery 中触发时显示的 Recaptcha?
- android - 使用一个命令设置不同的 XML 标签
- python - 如何在 pyspark 数据框的列中创建列表
- curl - curl 命令 ssl 不工作给 LibreSSL SSL_connect: SSL_ERROR_SYSCALL