阅读一些在线论坛和堆栈溢出问题后,我的理解是:
当执行程序的内存不足时,就会发生数据泄漏。 随机溢出(内存)是在我们溢出数据时在内存中反序列化形式的数据的大小。
我正在本地运行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:
事件时间轴:45个任务,因为有4.25GB数据的45个分区。
这是我尝试运行的代码which is solution for my previous problem。
答案 0 :(得分:0)
我观察到Windows任务管理器中的内存消耗在作业运行时从未超过10.5GB,那么改组溢出(内存)可能是26.7 GB。
这是因为指标是在整个任务中汇总的。因此,如果发生了三次泄漏,每次内存为10GB,则总数可能甚至为30GB。