Performance 如何优化SparkPagerBank示例应用程序以缩短垃圾收集时间?
我正在AmazonEC2机器上的7节点集群1驱动程序和6个执行器中运行Spark应用程序。我使用6个m4.2x大型实例,每个实例有1个执行器。它们每个有8个核。驱动程序位于m4.xlarge虚拟机上,该虚拟机有4个内核。spark版本是2.1.1 我使用以下命令启动Performance 如何优化SparkPagerBank示例应用程序以缩短垃圾收集时间?,performance,apache-spark,garbage-collection,Performance,Apache Spark,Garbage Collection,我正在AmazonEC2机器上的7节点集群1驱动程序和6个执行器中运行Spark应用程序。我使用6个m4.2x大型实例,每个实例有1个执行器。它们每个有8个核。驱动程序位于m4.xlarge虚拟机上,该虚拟机有4个内核。spark版本是2.1.1 我使用以下命令启动SparkPageRank应用程序 spark-submit \ --name "ABC" \ --master spark://xxx:7077 \ --conf spark.driver.memory=10g \
SparkPageRank
应用程序
spark-submit \
--name "ABC" \
--master spark://xxx:7077 \
--conf spark.driver.memory=10g \
--conf "spark.app.name=ABC" \
--conf "spark.executor.extraJavaOptions=-XX:+UseG1GC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:ConcGCThreads=5" \
--class org.apache.spark.examples.SparkPageRank \
--executor-memory 22g \
/home/ubuntu/spark-2.1.1/examples/target/scala-2.11/jars/spark-examples_2.11-2.1.1.jar /hdfscheck/pagerank_data_11G_repl1.txt 4
使用这些配置的GC时间非常长
以下是其中一个执行器的GC日志块:
1810.053: [GC pause (GCLocker Initiated GC) (young), 0.1694102 secs]
[Parallel Time: 167.8 ms, GC Workers: 8]
[GC Worker Start (ms): Min: 1810053.2, Avg: 1810053.3, Max: 1810053.4, Diff: 0.1]
[Ext Root Scanning (ms): Min: 0.2, Avg: 0.4, Max: 0.7, Diff: 0.5, Sum: 2.9]
[Update RS (ms): Min: 12.4, Avg: 12.7, Max: 13.2, Diff: 0.7, Sum: 101.4]
[Processed Buffers: Min: 11, Avg: 12.9, Max: 16, Diff: 5, Sum: 103]
[Scan RS (ms): Min: 29.4, Avg: 29.8, Max: 30.1, Diff: 0.7, Sum: 238.7]
[Code Root Scanning (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
[Object Copy (ms): Min: 124.5, Avg: 124.6, Max: 124.7, Diff: 0.1, Sum: 996.9]
[Termination (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
[Termination Attempts: Min: 1, Avg: 2.2, Max: 5, Diff: 4, Sum: 18]
[GC Worker Other (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.1]
[GC Worker Total (ms): Min: 167.5, Avg: 167.5, Max: 167.6, Diff: 0.1, Sum: 1340.2]
[GC Worker End (ms): Min: 1810220.8, Avg: 1810220.8, Max: 1810220.8, Diff: 0.0]
[Code Root Fixup: 0.0 ms]
[Code Root Purge: 0.0 ms]
[Clear CT: 0.4 ms]
[Other: 1.2 ms]
[Choose CSet: 0.0 ms]
[Ref Proc: 0.5 ms]
[Ref Enq: 0.0 ms]
[Redirty Cards: 0.4 ms]
[Humongous Register: 0.0 ms]
[Humongous Reclaim: 0.0 ms]
[Free CSet: 0.1 ms]
[Eden: 992.0M(960.0M)->0.0B(960.0M) Survivors: 160.0M->160.0M Heap: 14.6G(22.0G)->13.8G(22.0G)]
[Times: user=1.34 sys=0.00, real=0.17 secs]
(更多信息请访问)
我只能看到一件可疑的事情,即并发标记结束花费了很多时间
如果有人能告诉我如何调整这个特殊情况下的垃圾收集,我将不胜感激。驱动程序节点所在的虚拟机有16GB内存,而执行器虚拟机有32GB内存。(不是真正的答案,只是一组帮助提示)
我的驱动程序节点有16GB内存
如果您使用spark.driver.memory=10g执行spark submit
,我认为情况并非如此
您应该改用--驱动程序内存
(这只是一个快捷方式,但会使事情更容易记住):
--驱动程序内存内存用于驱动程序的内存(例如1000M、2G)(默认值:1024M)
关于你的主要问题,GC的大量使用似乎是PageRank算法的工作原理。请注意,在输入不太大的情况下,大量使用随机写入
我还认为GC时间没有任务时间长
我担心RDD块只有2,因为这似乎表明并行性非常低,但这可能是它应该如何工作的
运行SparkPageRank示例
以下内容可替换为一个简单的运行示例SparkPageRank
(如Spark中所述)
(不是一个真正的答案,只是一系列的帮助提示)
我的驱动程序节点有16GB内存
如果您使用spark.driver.memory=10g执行spark submit
,我认为情况并非如此
您应该改用--驱动程序内存
(这只是一个快捷方式,但会使事情更容易记住):
--驱动程序内存内存用于驱动程序的内存(例如1000M、2G)(默认值:1024M)
关于你的主要问题,GC的大量使用似乎是PageRank算法的工作原理。请注意,在输入不太大的情况下,大量使用随机写入
我还认为GC时间没有任务时间长
我担心RDD块只有2,因为这似乎表明并行性非常低,但这可能是它应该如何工作的
运行SparkPageRank示例
以下内容可替换为一个简单的运行示例SparkPageRank
(如Spark中所述)
当说16/32GB时,我的意思是驱动程序节点所在的VM有16GB内存,而执行器VM有32GB内存。同样,如果我的理解是正确的,任务的gc时间也包括在任务时间的计算中。也就是说,垃圾收集是阻塞的。在这种情况下,我有各种任务,任务持续时间为1.6分钟,相关gc时间为1.1分钟。这难道不应该被视为很长吗?如果说是16/32 GB,我的意思是驱动程序节点所在的VM有16GB内存,而执行者VM有32GB内存。同样,如果我的理解是正确的,任务的gc时间也包括在任务时间的计算中。也就是说,垃圾收集是阻塞的。在这种情况下,我有各种任务,任务持续时间为1.6分钟,相关gc时间为1.1分钟。这难道不应该被认为很长吗?该数据集是否可用,以便我们可以尝试重现该场景?@eliasah:该数据集是[Friendster-SNAP数据集]()通过删除行来创建11G数据集是否可用,以便我们可以尝试重现场景?@eliasah:数据集是通过删除行来创建11G的[Friendster-SNAP数据集]()
spark-submit ... \
--class org.apache.spark.examples.SparkPageRank ... \
/home/ubuntu/spark-2.1.1/examples/target/scala-2.11/jars/spark-examples_2.11-2.1.1.jar