我已经为火花应用程序设置了如下参数:
--conf spark.executor.instances=20
--conf spark.driver.memory=4G
--conf spark.executor.memory=14G
--conf spark.executor.cores=8
我的工作中有一个随机播放阶段,当我查看spark UI时,我发现有几个执行器读取了超过20G的shuffle数据(shuffle read size),并且没有内存不足异常。
有人可以解释为什么执行者可以读取的数据多于分配的内存量(14G)吗?
答案 0 :(得分:2)
TL; DR:Shuffle将中间结果存储在磁盘上。
大多数Spark操作都以流式方式运行。让我们编写一个简单的程序来读取1T文本文件并计算行数:
sc.textFile("BIG_FILE.txt").count()
如果我需要,我可以在一台小型计算机上运行该程序(虽然它需要很长时间),因为一次只需要一行内存。 Shuffle的操作方式大致相同,将来自其他节点的传入数据写入磁盘,然后再通过它进行流式传输。