如何在Apache Spark应用程序中优化shuffle溢出

时间:2015-06-12 07:36:08

标签: apache-spark spark-streaming apache-spark-1.4

我正在运行一个包含2名工作人员的Spark流应用程序。 应用程序有一个连接和联合操作。

所有批次都已成功完成,但注意到随机溢出指标与输入数据大小或输出数据大小不一致(溢出内存超过20次)。

请在下图中找到火花阶段的详细信息: enter image description here

经过研究,发现

当没有足够的随机数据存储空间时,就会发生随机溢出。

Shuffle spill (memory) - 溢出时内存中反序列化数据的大小

shuffle spill (disk) - 溢出后磁盘上数据序列化形式的大小

由于反序列化数据比序列化数据占用更多空间。所以,Shuffle溢出(记忆)更多。

注意到这个溢出内存大小非常大,输入数据很大

我的查询是:

这种溢出是否会对性能产生很大影响?

如何优化内存和磁盘的溢出?

是否有任何Spark属性可以减少/控制这种巨大的溢出?

2 个答案:

答案 0 :(得分:47)

学习表演 - 调整Spark需要相当多的调查和学习。有一些很好的资源,包括this video。 Spark 1.4在界面中有一些更好的诊断和可视化功能,可以帮助您。

总之,当阶段结束时RDD分区的大小超过可用于shuffle缓冲区的内存量时,会溢出。

你可以:

  1. 手动repartition()您的前一阶段,以便您输入较小的分区。
  2. 通过增加执行程序进程(spark.executor.memory
  3. 中的内存来增加shuffle缓冲区
  4. 通过增加分配给它的执行程序内存的分数(spark.shuffle.memoryFraction)来增加shuffle缓冲区,默认值为0.2。您需要回馈spark.storage.memoryFraction
  5. 通过减少工作线程(SPARK_WORKER_CORES)与执行程序内存的比率来增加每个线程的shuffle缓冲区
  6. 如果有专家倾听,我很想了解更多关于memoryFraction设置如何互动及其合理范围的信息。

答案 1 :(得分:0)

要添加到上述答案中,您还可以考虑将默认的分区数量( spark.sql.shuffle.partitions )从200(发生随机播放时)增加到一个大小接近hdfs块大小的分区(即128mb至256mb)

如果您的数据不正确,请尝试一些技巧,例如加盐键以增加并行度。

阅读本文以了解火花存储器管理:

https://0x0fff.com/spark-memory-management/

https://www.tutorialdocs.com/article/spark-memory-management.html