关于广播引发Driver内存溢出的疑问:Driver是否会复制广播数据?
广播操作引发Driver内存溢出的原因及Driver内存使用说明
Driver是否会持有广播数据的内存副本?
是的,Driver必然会将广播数据加载到自身内存中。广播的核心流程是:Driver首先从数据源读取要广播的数据,将其加载到自己的JVM内存里完成序列化,之后才会把序列化后的分发送给各个Executor节点。所以Driver本身会持有一份完整的广播数据内存副本。
广播时Driver内存溢出的常见原因
- 广播数据实际体积超出预期:有时候你以为是“较小的表”,但实际数据可能包含大量重复值、大字段(比如长文本、二进制数据),或者统计的大小是压缩后的尺寸,加载到内存后体积膨胀数倍,直接撑爆Driver内存。
- 多广播对象叠加占用:如果同时触发多个广播操作,多个数据集的内存占用叠加后,超出了Driver的内存上限,就会引发溢出。
- 序列化/反序列化的额外开销:Driver在处理广播数据时,需要进行序列化操作,这个过程中会产生临时对象、序列化缓存等额外内存占用,这部分开销如果没被考虑到,也可能导致内存不足。
- Driver内存配置过低:如果Driver的
spark.driver.memory参数设置得太小,哪怕是中等大小的广播数据,也可能直接导致内存溢出。
内容的提问来源于stack exchange,提问作者Matthew
相关产品推荐
相关产品推荐

