apache-spark - 如何优化 Apache Spark 应用程序中的 shuffle 溢出

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

我正在运行一个有 2 个工作线程的 Spark 流应用程序。 应用程序具有连接和并集操作。

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

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

经过研究,发现

当没有足够的内存用于随机播放数据时,就会发生随机播放溢出。

随机溢出(内存) - 溢出时内存中数据的反序列化形式的大小

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

因为反序列化的数据比序列化的数据占用更多的空间。所以,Shuffle 溢出(内存)更多。

注意到,对于大量输入数据,溢出内存大小非常大

我的查询是:

这种溢出是否会显着影响性能?

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

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

最佳答案

学习调优 Spark 性能需要大量的调查和学习。有一些很好的资源,包括this video 。 Spark 1.4 在界面中提供了一些更好的诊断和可视化功能,可以为您提供帮助。

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

你可以:

  1. 手动repartition()您的前一阶段,以便您从输入中获得更小的分区。
  2. 通过增加执行程序进程中的内存 (spark.executor.memory) 来增加洗牌缓冲区
  3. 通过增加分配给 shuffle 缓冲区的执行程序内存比例 (spark.shuffle.memoryFraction)(默认值 0.2)来增加 shuffle 缓冲区。您需要回馈 spark.storage.memoryFraction
  4. 通过减少工作线程 (SPARK_WORKER_CORES) 与执行程序内存的比率来增加每个线程的洗牌缓冲区

如果有专家聆听,我很想了解更多有关内存分数设置如何交互及其合理范围的信息。

关于apache-spark - 如何优化 Apache Spark 应用程序中的 shuffle 溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30797724/

相关文章:

apache-spark - 如何通过聚合在 Hive 中透视数据

java - Spark 还是传统的守护进程来处理流更新?

scala - 使用 SBT : Invalid or corrupt jarfile 构建 Apache Spark

apache-spark - 在 Apache Spark SQL 中,如何从 HiveContext 关闭元存储连接

apache-spark - Delta Lake 回滚

java - 无法使用 Java SocketFactory 库连接到 Cloud SQL

scala - 如何将列作为要加入的键的集合加入数据集?

apache-spark - spark-mapwithstate 为什么存储空间的数量还是20个?

hadoop - 流学习中的批处理学习以进行聚类