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队列资源不足导致的应用运行失败

这类问题主要针对提交作业的调优:

  • 在J2EE中间层,通过线程池技术提交作业,并设置线程池大小为1。
  • 若有些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掉

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)

愿你我都能在各自的领域里不断成长,勇敢追求梦想,同时也保持对世界的好奇与善意。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值