Hadoop 火花划痕空间

Hadoop 火花划痕空间,hadoop,apache-spark,caching,memory,memory-management,Hadoop,Apache Spark,Caching,Memory,Memory Management,我有一个13台机器的集群,有4个物理CPU和24G的RAM 我用一个驱动程序和12个从机启动了一个spark群集 我将从机的核心数设置为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.execut

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

我用一个驱动程序和12个从机启动了一个spark群集

我将从机的核心数设置为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')]
我知道executor有15G的RAM,有8个任务槽,并行度为48(48=6个任务槽*12个从机)

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

这可能是第一个问题:为什么是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
=>我理解:内存大小:42.7GB+磁盘大小:73.3GB=110G! =>所以我的6G文件在37G和110G上进行了转换

但我试图理解为什么我的遗嘱执行人身上还留有一些记忆,我去了一个“错误”转储,我看到:

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.6KB的块(只有1Mo!),但我不能,因为有一个7.7GB的[“暂存空间”]“在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个从机=>180GB的内存,我只能缓存40GB。。。但事实上我记得记忆是分开的:

星火30%

54%用于存储

洗牌16%

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

组。。。这是一个很长的帖子! 有很多问题。。。对不起