为什么Spark应用程序运行速度慢得多,MaxGCPauseMillis较低?

时间:2016-02-09 07:37:19

标签: performance apache-spark garbage-collection g1gc

我正在使用不同的G1配置测试Spark-1.5.1并观察我的应用程序需要2分钟才能完成MaxGCPauseMillis = 200(默认值)和4分钟MaxGCPauseMillis = 1.堆使用情况如下所示。我们从下面的统计数据中可以看出,两种配置的GC时间仅相差5秒。

我想知道为什么执行时间会增加这么多?

一些统计数据:

MaxGCPauseMillis = 200 - 年轻的GC:67;遗嘱执行人的GC时间:9.8秒

MaxGCPauseMillis = 200 MaxGCPauseMillis = 1 - 年轻的GC:224;遗嘱执行人的GC时间:14.7秒

MaxGCPauseMillis = 1 红色区域是年轻一代,黑色是老一代。该应用程序在10个节点上运行,每个节点有1个执行器和6 GB堆。

该应用程序是一个字数统计示例:

val lines = sc.textFile(args(0), 1)

val words = lines.flatMap(l => SPACE.split(l))
val ones = words.map(w => (w,1))
val counts = ones.reduceByKey(_ + _)

//val output = counts.collect()
//output.foreach(t => println(t._1 + ": " + t._2))
counts.saveAsTextFile(args(1))

2 个答案:

答案 0 :(得分:2)

MaxGCPauseMillis是对JVM的一个提示,即由GC引起的总暂停时间不应超过指定值(以毫秒为单位)。对于大多数生产等级系统,建议值为200毫秒。

任何较低的值都可能会强制GC运行的次数超过其所需的次数,并且会影响应用程序的整体吞吐量,这恰好发生在您的情况下。

当我们配置67时,年轻GC的数量为MaxGCPauseMillis=200,而当我们配置224时,年轻GC的数量几乎是MaxGCPauseMillis=1的4倍

有关详细说明,请参阅here

答案 1 :(得分:0)

你的直觉是错误的。相反,理论上,在选择堆大小的情况下,吞吐量和延迟(在这种情况下由MaxGCPauseMillis暗示)具有反作用。因此,当您降低MaxGCPauseMillis并因此降低延迟时,您的吞吐量也会降低。