我为spark应用程序设置了以下参数:
--conf spark.executor.instances=20
--conf spark.driver.memory=4G
--conf spark.executor.memory=14G
--conf spark.executor.cores=8
在我的工作中有一个shuffle阶段,当我检查spark ui时,我发现几个执行器读取了超过20g的shuffle数据(shuffle read size),并且没有内存不足的异常。
有人能解释为什么执行器可以读取比分配的内存量(14g)更多的数据吗?
1条答案
按热度按时间vulvrdjw1#
热释光;dr:shuffle将中间结果存储在磁盘上。
大多数spark操作都是以流方式运行的。让我们编写一个简单的程序来读取1t文本文件并计算行数:
如果需要的话,我可以在一台小型计算机上运行这个程序(虽然需要很长时间),因为一次只需要在内存中运行一行。shuffle的操作方式大致相同,它将来自其他节点的传入数据写入磁盘,然后通过流传输。