为什么改组溢出(内存)超过了火花驱动程序/执行器的内存

时间:2019-06-25 00:13:59

标签: apache-spark pyspark shuffle

阅读一些在线论坛和堆栈溢出问题后,我的理解是:

当执行程序的内存不足时,就会发生数据泄漏。 随机溢出(内存)是在我们溢出数据时在内存中反序列化形式的数据的大小。

我正在本地运行spark,并且将spark驱动程序的内存设置为10g

如果我的理解是正确的,那么如果groupBy操作需要的存储量超过10GB,它必须将数据溢出到磁盘上。

让我们假设groupBy操作需要12GB内存,因为驱动程序内存设置为10GB,它必须将近2GB数据溢出到磁盘,因此Shuffle Spill(磁盘)应为2GB,随机播放溢出(内存)应为10GB,因为随机播放溢出(内存)是溢出时内存中数据的大小。

如果我的理解正确,那么Shuffle spill (memory) <= Executor memory。就我而言,这是驱动程序内存,因为我在本地运行spark。

但是似乎我丢失了一些东西,下面是spark ui中的值。

    Total Time Across All Tasks: 41 min
    Locality Level Summary: Process local: 45
    Input Size / Records: 1428.1 MB / 42783987
    Shuffle Write: 3.8 GB / 23391365
    Shuffle Spill (Memory): 26.7 GB
    Shuffle Spill (Disk): 2.1 GB

即使我将Spark驱动程序的内存设置为10g,内存改组比分配给驱动程序的内存溢出的可能性还大。

我观察到Windows任务管理器中的内存消耗从未超过10.5GB,而作业正在运行,那么随机溢出(内存)可能是26.7 GB。

DAG:

DAG Visualization

事件时间轴:45个任务,因为有4.25GB数据的45个分区。

Event Timeline

这是我尝试运行的代码which is solution for my previous problem

1 个答案:

答案 0 :(得分:0)

  

我观察到Windows任务管理器中的内存消耗在作业运行时从未超过10.5GB,那么改组溢出(内存)可能是26.7 GB。

这是因为指标是在整个任务中汇总的。因此,如果发生了三次泄漏,每次内存为10GB,则总数可能甚至为30GB。