为什么火花执行器可以进行随机读取超过内存分配?

时间:2016-10-28 14:34:47

标签: apache-spark

我已经为火花应用程序设置了如下参数:

--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)吗?

1 个答案:

答案 0 :(得分:2)

TL; DR:Shuffle将中间结果存储在磁盘上。

大多数Spark操作都以流式方式运行。让我们编写一个简单的程序来读取1T文本文件并计算行数:

sc.textFile("BIG_FILE.txt").count()

如果我需要,我可以在一台小型计算机上运行该程序(虽然它需要很长时间),因为一次只需要一行内存。 Shuffle的操作方式大致相同,将来自其他节点的传入数据写入磁盘,然后再通过它进行流式传输。