我正在运行一个有 2 个工作人员的 Spark 流应用程序。
应用程序具有连接和并集操作。
所有批次均已成功完成,但注意到 shuffle 溢出指标与输入数据大小或输出数据大小不一致(溢出内存超过 20 倍)。
Please find the spark stage details in the below image:
经过对此进行研究后发现
当没有足够的内存用于随机数据时,就会发生随机溢出。
Shuffle spill (memory)
- 溢出时内存中数据的反序列化形式的大小
shuffle spill (disk)
- 溢出后磁盘上数据的序列化形式的大小
由于反序列化数据比序列化数据占用更多空间。所以,Shuffle 溢出(内存)比较多。
注意到这个输入数据量很大时,溢出内存大小非常大.
我的疑问是:
这种溢出是否会严重影响性能?
如何优化内存和磁盘的溢出?
是否有任何 Spark 属性可以减少/控制这种巨大的泄漏?
学习 Spark 性能调优需要大量的调查和学习。有一些很好的资源,包括这个视频 https://youtu.be/7ooZ4S7Ay6Y。 Spark 1.4 在界面中提供了一些更好的诊断和可视化功能,可以为您提供帮助。
总之,当阶段结束时 RDD 分区的大小超过 shuffle 缓冲区的可用内存量时,就会发生溢出。
You can:
- 手动
repartition()
您的前一阶段,以便您从输入中获得更小的分区。
- 通过增加执行程序进程中的内存来增加洗牌缓冲区(
spark.executor.memory
)
- 通过增加分配给它的执行程序内存的比例来增加洗牌缓冲区(
spark.shuffle.memoryFraction
) 从默认值 0.2 开始。你需要回馈spark.storage.memoryFraction
.
- 通过减少工作线程的比例来增加每个线程的洗牌缓冲区(
SPARK_WORKER_CORES
) 到执行器内存
如果有专家聆听,我很想了解更多有关 memoryFraction 设置如何交互及其合理范围的信息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)