Spark入门:Spark on Yarn 内存模块介绍,及常见报错与解决办法

Spark on Yarn 内存模块介绍

由于spark节点分为Driver(只有一个)线程占用和Executor(一般有多个)线程占用两种概念。但两种节点内存模型一样,且OOM常发生在Executor,所以下面以单个Executor为例进行介绍。
Spark内存模型以及与yarn的关系如下图:
在这里插入图片描述

① NM是yarn的一个服务,它可以控制单个container( spark executor)的最大内存上限,由这个参数进行控制yarn.scheduler.maximum-allocation-mb。我们的集群中druid,jmart_ad,evil是28G,其余集群(10k、hope、tyrande等)是52G。后面称此值为(Max)MonitorMemory
② Container是NM中的一个服务,每个Spark Executor会单独占用一个Container。单个Container内存的上限,就是Spark Executor内存上限。后面称此值为MonitorMemory
③ MonitorMemory = spark.yarn.executor.memoryOverhead + spark.executor.memory。我们集群中,memoryOverhead设置成固定的4G,用户也可以通过参数自己调整。
④ spark.executor.memory 需要用户自己设置。我们的集群中,建议 1 excutor core 对应 2~4G executor.memory

常见OOM类型,及解决办法

问题1: 提交任务时,启动失败。
例如: spark-shell --conf spark.executor.memory=100G
报错: java.lang.IllegalArgumentException: Required executor memory (102400+4096 MB) is above the max threshold (28672 MB) of this cluster! Please check the values of ‘yarn.scheduler.maximum-allocation-mb’ and/or ‘yarn.nodemanager.resource.memory-mb’.
原因1: 启动时 memoryOverhead+memory > (Max)MonitorMemory
解决1: 减小两个参数的值即可。

问题2:Driver中发现报错:YarnAllocator: Container killed by YARN for exceeding memory limits. X GB of Y GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.
原因2:运行时 memoryOverhead+memory > MonitorMemory
解决2:增大overhead/memory的大小,不超过(Max)MonitorMemory即可。若已经到max仍然报错,可以减少单个Executor的并发数(cores),增大Executor数量。

问题3:Excutor日志中发现报错:java.lang.OutOfMemoryError: Java heap space 、org.apache.spark.shuffle.FetchFailedException: Java heap space、 Container killed on request. Exit code is 143
原因3:程序运行时所需内存 > memory。一般是因为处理数据量或者缓存的数据量较大,已有内存不足 并且内存分配速度 > GC回收速度导致。
解决3:增大memory、减少单个Executor的并发数(cores)、减少不必要的cache操作、尽量不要对比较大的数据做broadcast、尽量避免shuffle算子或者对程序逻辑/底层数据进行优化。

问题4:org.apache.spark.shuffle.FetchFailedException: java.io.FileNotFoundException: …shuffle_xxx.index (No such file or directory)
原因4:OOM导致shuffle获取文件失败,此报错只是一个结果,原因是由于上述OOM导致,请详细查看日志是否有OOM的关键字。
解决4:找到OOM关键字,解决OOM问题即可。 或者开启external shuffle service, --conf spark.shuffle.service.enabled=ture

问题5:org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.ipc.StandbyException): Operation category WRITE is not supported in state standby
原因5:访问(读、写)hdfs,namenode(hdfs的管理节点)较忙压力较大时,spark超过一定时间会自动切换到namenod的standby节点尝试访问。standby会返回这个异常信息,然后spark会自动连接active节点。 所以该报错只是hdfs较忙的一个提示,并不是spark运行报错。
解决5:继续等待即可,或者联系集市管理人员咨询为什么hfds压力较大。

问题6:
YarnScheduler: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient resources
ERROR FileFormatWriter: Aborting job null.
java.util.concurrent.TimeoutException: Futures timed out after [300 seconds]
原因6: driver启动后提交job,超过300s(默认值)没有启动Executor会导致app超时失败
解决6: 1. 调整任务执行时间,选择资源充足的时段执行。 2. 调整超时时间 --conf spark.sql.broadcastTimeout=900 (15分钟 或者其他值)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值