今天就跟大家聊聊有关如何进行spark on yarn集群调优,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
成都创新互联是一家以成都网站建设、网页设计、品牌设计、软件运维、成都网站营销、小程序App开发等移动开发为一体互联网公司。已累计为成都木制凉亭等众行业中小客户提供优质的互联网建站和软件开发服务。
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集群调优有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注创新互联行业资讯频道,感谢大家的支持。