我正在使用Python和Spark附带的基本wordcount example在Amazon EMR上测试Spark。
运行应用程序后,我意识到在第0阶段reduceByKey(添加)中,大约2.5GB shuffle溢出到内存,4GB shuffle溢出到磁盘。因为在wordcount示例中我不缓存或持久化任何数据,所以我认为我可以通过提供更多的shuffle memoryFraction来提高此应用程序的性能。所以,在spark-defaults.conf中,我添加了以下内容:
spark.storage.memoryFraction 0.2
spark.shuffle.memoryFraction 0.6
但是,我仍然获得相同的性能,并且相同数量的随机数据正在溢出到磁盘和内存。我验证了Spark正在使用Spark UI / Environment读取这些配置,我可以看到我的更改。此外,我尝试将spark.shuffle.spill
设置为false,我得到了我正在寻找的性能,并且所有的shuffle数据都只溢出到内存中。
那么,我在这里出错了什么,为什么不利用额外的shuffle内存部分?
我的环境:
运行使用-x参数的Spark 1.3.1的Amazon EMR
1主节点:m3.xlarge
3核心节点:m3.xlarge
应用:wordcount.py
输入:存储在S3中的10个.gz文件各90MB(未经存档350MB)
提交命令:
/home/hadoop/spark/bin/spark-submit --deploy-mode client /mnt/wordcount.py s3n://<input location>
spark-defaults.conf:
spark.eventLog.enabled false
spark.executor.extraJavaOptions -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:MaxHeapFreeRatio=70
spark.driver.extraJavaOptions -Dspark.driver.log.level=INFO
spark.master yarn
spark.executor.instances 3
spark.executor.cores 4
spark.executor.memory 9404M
spark.default.parallelism 12
spark.eventLog.enabled true
spark.eventLog.dir hdfs:///spark-logs/
spark.storage.memoryFraction 0.2
spark.shuffle.memoryFraction 0.6