如何优化 Apache Spark 应用程序中的 shuffle 溢出
How to optimize shuffle spill in Apache Spark application
我是 运行 一个 Spark 流应用程序,有 2 个工作人员。
应用程序有一个连接和一个联合操作。
所有批次都成功完成,但注意到随机溢出指标与输入数据大小或输出数据大小不一致(溢出内存超过 20 倍)。
请在下图中找到火花阶段的详细信息:
经过研究,发现
随机播放数据的内存不足时会发生随机播放溢出。
Shuffle spill (memory)
- 溢出时内存中数据反序列化形式的大小
shuffle spill (disk)
- 溢出后磁盘上数据序列化形式的大小
因为反序列化数据比序列化数据占用更多space。所以,Shuffle溢出(内存)就多了。
注意到这个溢出内存大小对于大输入数据来说非常大。
我的查询是:
这种溢出是否会显着影响性能?
如何优化内存和磁盘溢出?
是否有任何 Spark 属性可以减少/控制这种巨大的溢出?
学习性能调优 Spark 需要大量的调查和学习。有一些很好的资源,包括 this video。 Spark 1.4 在界面中有一些更好的诊断和可视化,可以帮助你。
总而言之,当阶段末尾的 RDD 分区大小超过随机缓冲区的可用内存量时,您就会溢出。
您可以:
- 手动
repartition()
您的前一阶段,以便您从输入中获得更小的分区。
- 通过增加执行程序进程中的内存来增加随机播放缓冲区 (
spark.executor.memory
)
- 通过增加分配给它的执行程序内存的比例 (
spark.shuffle.memoryFraction
) 从默认值 0.2 增加洗牌缓冲区。你需要回馈 spark.storage.memoryFraction
。
- 通过降低工作线程 (
SPARK_WORKER_CORES
) 与执行程序内存的比率来增加每个线程的洗牌缓冲区
如果有专家在听,我很想知道更多关于 memoryFraction 设置如何相互作用以及它们的合理范围。
要添加到上述答案中,您还可以考虑将分区的默认数量 (spark.sql.shuffle.partitions) 从 200(发生随机播放时)增加到将导致分区大小接近 hdfs 块大小(即 128mb 到 256mb)
如果您的数据是倾斜的,请尝试一些技巧,例如对键进行加盐以提高并行度。
阅读本文以了解 spark 内存管理:
https://0x0fff.com/spark-memory-management/
https://www.tutorialdocs.com/article/spark-memory-management.html
我是 运行 一个 Spark 流应用程序,有 2 个工作人员。 应用程序有一个连接和一个联合操作。
所有批次都成功完成,但注意到随机溢出指标与输入数据大小或输出数据大小不一致(溢出内存超过 20 倍)。
请在下图中找到火花阶段的详细信息:
经过研究,发现
随机播放数据的内存不足时会发生随机播放溢出。
Shuffle spill (memory)
- 溢出时内存中数据反序列化形式的大小
shuffle spill (disk)
- 溢出后磁盘上数据序列化形式的大小
因为反序列化数据比序列化数据占用更多space。所以,Shuffle溢出(内存)就多了。
注意到这个溢出内存大小对于大输入数据来说非常大。
我的查询是:
这种溢出是否会显着影响性能?
如何优化内存和磁盘溢出?
是否有任何 Spark 属性可以减少/控制这种巨大的溢出?
学习性能调优 Spark 需要大量的调查和学习。有一些很好的资源,包括 this video。 Spark 1.4 在界面中有一些更好的诊断和可视化,可以帮助你。
总而言之,当阶段末尾的 RDD 分区大小超过随机缓冲区的可用内存量时,您就会溢出。
您可以:
- 手动
repartition()
您的前一阶段,以便您从输入中获得更小的分区。 - 通过增加执行程序进程中的内存来增加随机播放缓冲区 (
spark.executor.memory
) - 通过增加分配给它的执行程序内存的比例 (
spark.shuffle.memoryFraction
) 从默认值 0.2 增加洗牌缓冲区。你需要回馈spark.storage.memoryFraction
。 - 通过降低工作线程 (
SPARK_WORKER_CORES
) 与执行程序内存的比率来增加每个线程的洗牌缓冲区
如果有专家在听,我很想知道更多关于 memoryFraction 设置如何相互作用以及它们的合理范围。
要添加到上述答案中,您还可以考虑将分区的默认数量 (spark.sql.shuffle.partitions) 从 200(发生随机播放时)增加到将导致分区大小接近 hdfs 块大小(即 128mb 到 256mb)
如果您的数据是倾斜的,请尝试一些技巧,例如对键进行加盐以提高并行度。
阅读本文以了解 spark 内存管理:
https://0x0fff.com/spark-memory-management/
https://www.tutorialdocs.com/article/spark-memory-management.html