1、运行环境Jar包管理及数据本地性原理调优
1.1、运行环境Jar包管理及数据本地性调优实践
启动spark程序时,其他节点会自动下载jar包并进行缓存,下次启动时如果包没有变化,则直接读取本地缓存的包。缓存清理间隔在yarn-site.xml通过以下参数配置:
<property>
<name>yarn.nodemanager.localizer.Cache.cleanip.interval-ms</name>
<value>10000</value>
</property>
1.2、数据本地性调优
val conf = new SparkConf()
conf.set("spark.locality.wait", "3s")
conf.set("spark.locality.wait.node", "3s")
conf.set("spark.locality.wait.process", "3s")
conf.set("spark.locality.wait.rack", "3s")
默认情况下,这些等待时长都是3秒。观察大部分Task的数据本地化级别都是PROCESS_LOCAL的话,那就不需要调节这个参数了,如果很多Task的级别都是NODE_LOCAL、ANY,那么最好需要调节一下数据本地化的等待时长。
2、Spark on Yarn的两种不同的调度模型及其优化
2.1、Spark on Yarn的两种不同类型模型优劣分析
按照spark应用程序中Driver的位置不同,分为两种模式:yarn-cluster和yarn-client。在yarn-client模式下,Driver运行在启动spark应用的节点上,而yarn-cluster模式下,Driver运行在yarn container容器中,客户端可以从集群断开。
2.2、Spark on Yarn模式下Executor经常被杀死
如果出现Container killed by YARN for exceeding memory limits... 错误,那么很明显内存被用完,可以考虑增加内存。 优化方案有:
- 移除RDD缓存操作
- 增加该job的spark.storage.memoryFaction系数值
- 增加该job的spark.yarn.executor.memoryoverhead值
2.3、yarn-cluster模式下JVM栈内存溢出
有些spark作业在yarn-client模式下是可以正常运行的,但是在yarn-cluster模式下,会报JVM的PermGen(永久代)的内存溢出(OOM)。 出现以上问题的原因是:yarn-client模式下,Driver运行在本地机器上,spark使用JVM的PermGen的配置,是本地的默认配置128MB;但是在yarn-cluster的模式下,Driver运行在集群的某个节点上,spark使用的JVM的PermGen是没有经过配置的,默认82MB,故有时会出现PermGen Out of Memory error Log。 调优方案如下:
- 在spark-submit脚本中设置PermGen
-conf spark.driver.extraJavaOptions="-XX:PermSize=128M --MaxPermSize=256M"
- 如果使用SparkSQL,SQL中使用大量的or语句,也可能会报出JVM stack overflow,JVM栈内存溢出,此时可以把复杂的SQL简化为多个简单的SQL进行处理
|