Spark Scratch Space

时间:2018-02-08 11:09:04

标签: hadoop apache-spark caching memory memory-management

我有一台13台机器,有4个物理CPU和24 G RAM。

我启动了一个带有一个驱动程序和12个从属的火花簇。

我将slave的核心数量设置为12个核心,这意味着我有一个群集作为对象:

Alive Workers: 12
Cores in use: 144 Total, 110 Used
Memory in use: 263.9 GB Total, 187.0 GB Used

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

[('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')]

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

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

enter image description here

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

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

enter image description here

所以我试着理解为什么,我在ihm的存储部分看到了Memory / Disk的用法: enter image description here

所以RDD中有一部分停留在磁盘上。 另外我看到执行者可能仍有空闲记忆: enter image description here

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

Storage Level: Disk Serialized 1x Replicated
Cached Partitions: 72
Total Partitions: 72
Memory Size: 42.7 GB
Disk Size: 73.3 GB

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

但是我试着理解为什么我的遗嘱执行人仍然留下了一些记忆,然后我去了一个“错误”的转储,我看到了:

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.

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

=>什么是“临时空间”? ?

=> 6个任务=>来自48/12 = 6

的并行性

然后我回到应用程序信息,我看到持续48分钟的计数只读取37 Gb的数据! (48分钟显然也用于缓存数据) enter image description here

当我对缓存的数据帧进行计数时,我有116G输入读取: enter image description here

在一天结束时,缓存计数所节省的时间并不令人印象深刻,这里有3个持续时间: 4.8':依靠缓存的df 48':缓存时计数 5.8':指望不缓存df(直接从hdfs读取) enter image description here

那为什么会这样呢? 因为缓存的df没有那么缓存: enter image description here 含义或多或少内存为40 Gb,磁盘为60 Gb。

我很惊讶,因为在15G /执行者* 12奴隶=> 180 Gb的内存,我只能缓存40 Gb ...但实际上我记得内存是分裂的:

30%的火花

54%的存储空间

16%用于随机播放

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

Oups ......这是一篇很长的帖子! 很多问题......抱歉......

0 个答案:

没有答案