Spark分区大小大于执行器内存。

6

我有四个问题。 假设在 Spark 中有 3 个 worker 节点,每个 worker 节点有 3 个 executor,并且每个 executor 都有 3 个核心。 每个 executor 都有 5 GB 的内存(总共 6 个 executor、27 个核心和 15GB 的内存)。 如果:

  • 我有 30 个数据分区。 每个分区的大小为 6GB。 由于每个核心执行一个分区/任务(每个分区一个任务),所以最佳情况是分区数等于核心数。 在这种情况下,由于分区大小大于可用的 executor 内存,每个 executor 核心将如何处理分区? 注意:我没有调用 cache() 或 persist(),只是在我的 RDD 上应用一些窄转换,例如 map() 和 filter()。

  • Spark 是否会自动尝试将分区存储在磁盘上? (我没有调用 cache() 或 persist(),但在调用操作之后仅发生了转换)

  • 由于我有大于可用核心数(27)的分区(30),因此最多可以处理 27 个分区,剩下的 3 个分区会发生什么? 它们会等待空闲核心吗?

  • 如果我调用了存储级别设置为 MEMORY_AND_DISK 的 persist(),则如果分区大小大于内存,则会将数据溢出到磁盘上?这些数据将存储在哪个磁盘上?worker 节点的外部 HDD 上吗?


如果你有100K个分区,你是在说你需要100K个核心吗?我认为不是。 - thebluephantom
你是怎么知道每个分区的大小的? - MsCurious
2个回答

2
我会根据我所知的情况回答每个部分,可能会忽略你的一些断言:
我有四个问题。假设在Spark中,我有3个工作节点。每个工作节点有3个执行者,每个执行者有3个核心。每个执行者有5GB内存。(总共6个执行者,27个核心和15GB内存)。如果: >>> 我使用1个执行器,1个核心。这通常是被接受的范例。
- 我有30个数据分区。每个分区的大小为6GB。最优情况下,分区数应等于核心数,因为每个核心执行一个分区/任务(每个分区一个任务)。在这种情况下,每个执行器-核心将如何处理分区,因为分区大小大于可用执行器内存?注意:我没有调用cache()或persist(),只是对我的rdd应用了一些窄转换,如map()和filter()。 >>> 分区数与核心数相同不是真的。您可以使用10个核心服务1000个分区,每次处理一个。如果您有100K个分区和本地环境,那么您不太可能得到100K个执行器。 >>> 现在离开Driver-side收集问题不谈:您可能没有足够的内存来执行给定的操作,Spark可以将其溢出到磁盘文件中,但会影响处理速度。但是,分区大小不应超过最大大小,这在一段时间前得到了加强。使用多核执行器可能会发生故障,即OOM's,也是GC问题的结果,这是一个棘手的问题。
Spark是否会自动尝试将分区存储到磁盘上?(我没有调用cache()或persist(),只是在调用操作后进行了一些转换) >>> 如果可以避免,则不会,但当内存紧张时,会发生驱逐/溢出到磁盘,并且在某些情况下会从源或最后一个检查点重新计算。
由于我有30个分区大于可用核心数27,所以在最大情况下,我的集群只能处理27个分区,剩余的3个分区会发生什么?它们会等待被占用的核心被释放吗? >>> 它们将在某个时间点由空闲执行器服务。
如果我调用了持久化(persist()),其存储级别设置为MEMORY_AND_DISK,那么如果分区大小大于内存,它将把数据溢出到磁盘上?这些数据将存储在哪个磁盘上?工作节点的外部硬盘驱动器? >>> 是的,它将被溢出到本地文件系统中。我认为您可以通过设置来配置HDFS,但本地磁盘更快。

这是一篇富有洞见的博客:https://medium.com/swlh/spark-oom-error-closeup-462c7a01709d


被接受的范例不是每个执行器5个内核吗?你提到的链接也表明被接受的做法是每个执行器5个内核? - Bolshoi Booze
不是我所在的地方,通常的指南是1。但每个人都可以有自己的意见。在我去过的大多数商店里都是这样的。我认为即使在SO上也存在一些细微差别。 - thebluephantom
1
好的,我知道,但是在我所在的地方更多使用的是执行器和核心=1的情况。我在上周末重新检查了这个问题,并向您展示了以下链接:https://www.davidmcginnis.net/post/spark-job-optimization-myth-5-increasing-executor-cores-is-always-a-good-idea。此外,在Spark中,执行器每个核心的默认值为1。我希望这一点已经考虑过了。 - thebluephantom

0
  1. 您的数据分区大小似乎比核心内存大。您的核心内存为约1.6 GB(5GB/3 Core)。这将成为问题,因为您的分区将无法在核心中进行处理。要解决此问题,您可以尝试:

    • 增加分区数量,使每个分区都小于核心内存约1.6 GB。因此,将它们增加到大约150个分区。
    • 如果保持分区不变,则应尝试增加执行器内存,可能还要减少执行器中的核心数。
  2. 如果一切顺利,它将不需要将分区存储在磁盘上。但是,如果它无法找到足够的内存,它将把磁盘作为备份。如果您想将数据存储在磁盘上并将其保留下来,您需要调用persist(DISK_ONLY)。

  3. 他们将等待其中一个核心可用。

  4. 是的,它将溢出到磁盘上。具体位置取决于您的集群配置。


为什么要减少核心数量?这有什么帮助吗? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接