火花暂存空间

Rom*_*uin 7 memory caching hadoop memory-management apache-spark

我有一个由 13 台机器组成的集群,有 4 个物理 CPU 和 24 G RAM。

我启动了一个包含 1 个驱动程序和 12 个从程序的 Spark 集群。

我将从属设备的核心数设置为 12 个核心,这意味着我有一个集群,如下所示:

Alive Workers: 12
Cores in use: 144 Total, 110 Used
Memory in use: 263.9 GB Total, 187.0 GB Used
Run Code Online (Sandbox Code Playgroud)

我使用以下配置启动了一个应用程序:

[('spark.driver.cores', '4'),
 ('spark.executor.memory', '15G'),
 ('spark.executor.id', 'driver'),
 ('spark.driver.memory', '5G'),
 ('spark.python.worker.memory', '1042M'),
 ('spark.cores.max', '96'),
 ('spark.rdd.compress', 'True'),
 ('spark.serializer.objectStreamReset', '100'),
 ('spark.executor.cores', '8'),
 ('spark.default.parallelism', '48')]
Run Code Online (Sandbox Code Playgroud)

据我所知,执行器有 15G RAM,有 8 个任务槽,并行度为 48(48 = 6 个任务槽 * 12 个从机)。

然后我在 HDFS 上有两个大文件:每个 6 G(来自 12 个文件的目录,每个文件 5 个块,每个 128 Mb),复制因子为 3 倍。我合并这两个文件 => 我认为我得到了一个 12 GB 的数据帧,但我通过 IHM 看到了 37 G 的读取输入:

在此输入图像描述

这可能是第一个问题:为什么是 37 Gb?

然后,由于执行时间对我来说太长,我尝试缓存数据,以便我可以更快地执行。但缓存方法永远不会结束,在这里您可以看到距离结束已经有 45 分钟了(相对于未缓存的 6 分钟!):

在此输入图像描述

所以我试图理解为什么,我在 ihm 的存储部分看到了内存/磁盘的使用: 在此输入图像描述

因此 RDD 的某些部分保留在磁盘上。此外,我看到执行者可能仍然有空闲内存: 在此输入图像描述

我注意到在同一个“存储”页面上,RDD 的大小已经跳跃:

Storage Level: Disk Serialized 1x Replicated
Cached Partitions: 72
Total Partitions: 72
Memory Size: 42.7 GB
Disk Size: 73.3 GB
Run Code Online (Sandbox Code Playgroud)

=> 我明白:内存大小:42.7 GB + 磁盘大小:73.3 GB = 110 G!=> 所以我的 6 G 文件已经转换为 37 G,然后转换为 110 G ???

但我试图理解为什么我的执行器上仍然留有一些内存,然后我转到其中一个的“err”转储,然后我看到:

18/02/08 11:04:08 INFO MemoryStore: Will not store rdd_50_46
18/02/08 11:04:09 WARN MemoryStore: Not enough space to cache rdd_50_46 in memory! (computed 1134.1 MB so far)
18/02/08 11:04:09 INFO MemoryStore: Memory use = 1641.6 KB (blocks) + 7.7 GB (scratch space shared across 6 tasks(s)) = 7.7 GB. Storage limit = 7.8 GB.
18/02/08 11:04:09 WARN BlockManager: Persisting block rdd_50_46 to disk instead.
Run Code Online (Sandbox Code Playgroud)

在这里,我看到执行器想要缓存一个 1641.6 KB 的块(只有 1Mo!),但我不能,因为有一个 7.7 Gb 的[“临时空间”]“在 6 个任务之间共享”。

=> 什么是“暂存空间”??

=> 6 个任务 => 来自并行度 48 / 12 = 6

然后我回到应用程序信息,我看到持续 48 分钟的计数仅读取了 37 GB 的数据!(这48分钟显然也是用来缓存数据的) 在此输入图像描述

当我对缓存的数据帧进行计数时,我读取了 116G 的输入: 在此输入图像描述

归根结底,缓存计数节省的时间并不那么令人印象深刻,这里有 3 个持续时间:4.8':计数缓存的 df 48':缓存时计数 5.8':计数未缓存的 df(直接从HDFS) 在此输入图像描述

那么为什么会这样呢?因为缓存的 df 没有缓存那么多: 在此输入图像描述 意味着内存或多或少为 40 Gb,磁盘为 60 Gb。

我很惊讶,因为在 15G / executor * 12 个从站 => 180 Gb 内存下,我只能缓存 40 Gb ...但事实上我记得内存是分割的:

火花30%

54% 用于存储

随机播放 16%

所以我知道我确实有 54% * 15G 用于存储,即 8.1 G,这意味着在我的 180 Gb 上,我只有 97 Gb 用于存储。为什么我还有90-40=50G没用呢?

哎呀...这是一篇很长的文章!问题有点多……抱歉……