Spark如何实现任务之间的内存公平?

Posted

技术标签:

【中文标题】Spark如何实现任务之间的内存公平?【英文标题】:How Spark achieves memory fairness between tasks? 【发布时间】:2021-09-04 06:11:06 【问题描述】:

我在看这个关于火花内存管理的presentation。

他谈到了他们如何在一个执行器中实现不同任务之间的公平性 (12:00)。他提出了任务之间动态分配的想法,并宣称如果开始执行更多任务,Spark 会将其他任务的页面溢出到磁盘。

我之前读过 Spark 中的任务本质上是线程,而在 Java 中我们没有这种能力来管理线程的内存并在它们之间建立内存公平性。我想知道 Spark 是如何做到这一点的?

【问题讨论】:

你一定错过了一个介绍,演示者会说 Spark 管理 spark.memory.fraction Java 堆的一部分。 spark.apache.org/docs/latest/… 谢谢,但这实际上如何解释 spark 如何在任务之间建立内存公平性?它如何跟踪每个任务使用了多少内存? 没有公平,你得到资源 @thebluephantom 你能解释一下吗?当演示者解释动态分配的概念时,他的字面意思是,如果我们有 N 个任务,每个任务都会分配 1/N 的内存,如果出现新任务,我们必须将分配给当前正在运行的任务的一些内存块溢出到磁盘上这个新任务的空间。我认为这是公平的 但即使是动态的,你也会得到分配 【参考方案1】:

我不确定公平是否有效。

这是对执行程序内存的出色读取,每个执行程序https://www.davidmcginnis.net/post/spark-job-optimization-myth-5-increasing-executor-cores-is-always-a-good-idea 分配超过 1 个核心,这与溢出到磁盘无关。

如果对于可用内存来说太大,则溢出到磁盘。也可以完全驱逐一个分区,导致重新计算(从上一个检查点开始)。

我所使用的范例与本文相似,因为我们使用单个核心运行更多执行器。 Spark 的默认值也确实是 1,我认为这是供应商深思熟虑的默认值。

【讨论】:

以上是关于Spark如何实现任务之间的内存公平?的主要内容,如果未能解决你的问题,请参考以下文章

Spark Streaming 如何在驱动程序和执行程序之间调度映射任务?

不看绝对血亏!mysqlserver安装失败

Java高级特性编程及实战答案

「每日一道大数据面试题系列」spark如何调优

为了跳槽强刷1000道Java真题,干货整理

学海无涯!java面试常问知识点