今天就跟大家聊聊有关如何进行spark on yarn集群调优,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
-
jar包管理:在spark-default.conf文件中指定Spark.YARN.jars在hdfs上的SPARK需要的jar包。否则每次提交application,spark会将driver端的SPARK_HOE下的jar.node, spark.locality.wait.pack包分发到各节点上。浪费磁盘资源和网络资源。
-
yarn队列资源不足导致的应用运行失败,这类问题主要针对提交作业的调优:
-
1.在J2EE中间层,通过线程池技术提交作业,并设置线程池大小为1。
-
2.若只有一个应用,可以将资源调整到最大
-
3.若有些spark应用明显的耗时,可以spark拥有的资源进行分类(耗时任务和快速任务),此时可以使用两个线程池提交作业,每个线程池大小为1。
-
数据本地化:分布式存储是大数据技术的核心,而为了提高大数据计算的效率,使计算靠近数据,减少移动大量数据而产生的网络io和磁盘io。
-
spark中的本地级别有:PROCESS_LOCAL(进程本地化,效率最高), NODE_LOCAL(节点本地化), PACK_LOCAL(机架本地化), ANY, NO_PREF。在实际运行中我们希望的是大多数计算是进程本地化或节点本地化。
-
调优方式:1. 优化算法 2. 数据设置合理的副本数 3. 将常用的rdd设置缓存 4. 设置spark相关参数spark.locality.wait,spark.locality.wait.process, spark.locality.wait.node, spark.locality.wait.pack。 在client模式下运行,观察运行日志,使得大多数计算是PROCESS_LOCAL,同时application运行时间减少了,才是有效的优化。为了提升数据计算本地化级别而牺牲application运行时间,是不可取得,这样也会造成大量资源的闲置和较长的等待时间。
-
Executor经常被kill掉,出现Container killed by YARN for exceeding memory limits,内存被用完导致此类问题的发生:
-
移除rdd缓存
-
spark.storage.memoryFraction:spark数据缓存的的内存占比,默认0.6,即可以使用executor的60%内存持久化数据。在缓存达到临界值,数据可能不能缓存或写入到磁盘。当executor经常被kill的时候,应该降低该值。
-
spark.yarn.Executor.memoryoverhead:该参数是在yarn模式下堆外内存的调节,默认情况下为是每一个executor的内存大小的10%
-
YARN-Cluster模式下JVM栈内存溢出:
-
JVM永久代PermGen设置 Spark.Driver.extraJavaOptions="-XX:PermSize=128M -XX:MaxPermSize=256M"(PermGen out of Memory error log)
-
在spark-sql中将复杂的sql语句简化为多个简单的sql进行处理(JVM stack overflow)
看完上述内容,你们对如何进行spark on yarn集群调优有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/220383.html