Hadoop 火花划痕空间
我有一个13台机器的集群,有4个物理CPU和24G的RAM 我用一个驱动程序和12个从机启动了一个spark群集 我将从机的核心数设置为12个,这意味着我有一个集群,如下所示: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
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克
组。。。这是一个很长的帖子!
有很多问题。。。对不起