Bol*_*oze 6 partitioning apache-spark rdd pyspark databricks
我有四个问题。假设在 Spark 中我有 3 个工作节点。每个工作节点有 3 个执行器,每个执行器有 3 个核心。每个执行器有 5 GB 内存。(总共 6 个执行器、27 个核心和 15GB 内存)。如果出现以下情况会发生什么:
我有 30 个数据分区。每个分区的大小为 6 GB。最佳情况下,分区数量必须等于核心数量,因为每个核心执行一个分区/任务(每个分区一个任务)。现在在这种情况下,由于分区大小大于可用执行器内存,每个执行器核心将如何处理分区?注意:我没有调用cache()或persist(),只是我在rdd上应用了一些狭窄的转换,例如map()和filter()。
Spark 会自动尝试将分区存储在磁盘上吗?(我没有调用cache()或persist(),而只是在调用操作后发生转换)
由于我的分区 (30) 大于可用核心数 (27),因此我的集群最多可以处理 27 个分区,那么剩余 3 个分区会发生什么情况?他们会等待被占用的核心被释放吗?
如果我调用 persist() ,其存储级别设置为 MEMORY_AND_DISK,那么如果分区大小大于内存,它会将数据溢出到磁盘吗?这些数据将存储在哪个磁盘上?工作节点的外部硬盘?
我按照我对每个部分的了解来回答,可能会忽略您的一些断言:
我有四个问题。假设在 Spark 中我有 3 个工作节点。每个工作节点有 3 个执行器,每个执行器有 3 个核心。每个执行器有 5 GB 内存。(总共 6 个执行器、27 个核心和 15GB 内存)。如果出现以下情况会发生什么: >>> 我将使用 1 个执行器、1 个核心。据我所知,这是普遍接受的范式。
我有 30 个数据分区。每个分区的大小为 6 GB。最佳情况下,分区数量必须等于核心数量,因为每个核心执行一个分区/任务(每个分区一个任务)。现在在这种情况下,由于分区大小大于可用执行器内存,每个执行器核心将如何处理分区?注意:我没有调用cache()或persist(),只是我在rdd上应用了一些狭窄的转换,例如map()和filter()。>>> 分区数与核心数相同是不正确的。您可以使用 10 个核心为 1000 个分区提供服务,一次处理一个。如果您有 100K 分区并且是本地部署怎么办?您不太可能获得 10 万个执行程序。>>> 继续并将驱动程序端收集问题留给一侧:您可能没有足够的内存来执行执行程序上的给定操作;Spark 可以将文件溢出到磁盘,但会牺牲处理速度。但是,分区大小不应超过前段时间加强的最大大小。使用多核 Executor 可能会发生失败,即 OOM,这也是 GC 问题的结果,这是一个困难的话题。
Spark 会自动尝试将分区存储在磁盘上吗?(我没有调用cache()或persist(),而只是在调用操作后发生转换)>>>如果可以避免它就不会,但是当内存紧张时,驱逐/溢出到磁盘可能并且将会发生,并且在某些情况下会从源或最后一个检查点重新计算。
由于我的分区 (30) 大于可用核心数 (27),因此我的集群最多可以处理 27 个分区,那么剩余 3 个分区会发生什么情况?他们会等待被占用的核心被释放吗?>>> 他们将在某个时间点由免费的执行者提供服务。
如果我调用存储级别设置为MEMORY_AND_DISK的persist(),那么如果分区大小大于内存,它会将数据溢出到磁盘吗?这些数据将存储在哪个磁盘上?工作节点的外部硬盘?>>> 是的,它将溢出到本地文件系统。我认为您可以通过设置配置 HDFS,但本地磁盘速度更快。
这是一篇富有洞察力的博客:https ://medium.com/swlh/spark-oom-error-closeup-462c7a01709d