Spark调优之旅

问题说明

1:spark-shell启动时重复提示:executor updated:app-2016*** is now Running
                                                    executor updated:app-2016*** is now Loading
               executor updated:app-2016*** is now Exited(Command exited with code 1)
2:跑一个100M以内的程序(简单的Collect())会提示java.lang.OutOfMemoryError: GC overhead limit exceeded

针对这两个问题,进行参数调整,从而达到解决问题的目的。

问题解决

针对问题1:
首先查看日志信息,发现日志中出现了:java.lang.OutOfMemoryError: Unable to create new native thread,出现这个问题,一般都是因为用户的最大线程数被做了限制,我们可以使用命令ulimit -a查看相关信息,在这里我们可以看到如下的信息:
max user processes (-u) 1024
open files (-n)65535
       ...  .....
可以看到用户最大线程数为1024,这里太小,需要做改动。使用命令ulimit -u 131072进行设置。之后启动正常。
针对这里的设置可以参考下面这篇文章,后面可能还会用得到。
http://stackoverflow.com/questions/21515463/how-to-increase-maximum-file-open-limit-ulimit-in-ubuntu/24339812
https://www.ibm.com/support/knowledgecenter/zh/SSYKE2_8.0.0/com.ibm.java.lnx.80.doc/user/ulimits.html

OK!再次启动,正常。

针对问题2:
问题2应该是经常能碰到的问题,出现这类问题,几乎都是跟内存有一定的关系,有可能是内存没有配置好。
这里我的环境是:
spark1.4
Scala2.10.4
JDK1.7
Hadoop2.7.2
然后进入到spark1.4/conf下的配置文件中,查看相关的内存配置:
SPARK_WORKER_CORES=10
SPARK_WORKER_INSTANCES=2
SPARK_WORKER_MEMORY=100G
...
这里请注意,INSTANCES数量,这个时候总的核数是:SPARK_WORKER_CORES*SPARK_WORKER_INSTANCES=10*2*(集群中服务器数量)
总的内存数是:SPARK_WORKER_MEMORY*SPARK_WORKER_INSTANCES=100g*2*(集群中服务器数量)
注意查看是否到了最大的内存数。
然后还有一个比较重要的概念:
SPARK_EXECUTOR_MEMORY,由于我在跑程序的时候没有进行设置,所以集群按照默认配置(512M)进行了配置。但是由于我们的数据量超过了这么大,所以这个时候会报错。
在这里我们做如下设置,在spark/conf下修改spark-env.sh文件
export SPARK_EXECUTOR_MEMORY=100g
然后重新启动spark集群,任务就能够跑出来了。

你可能感兴趣的:(spark,spark)