业务上使用 elasticsearch-hadoop 框架来处理 Elasticsearch 里面的数据,流程就是读取、中间处理、写入,然后由于数据量级太大的【占用的内存也大】原因,出现异常:Container killed by YARN for exceeding memory limits.,这个异常其实很常见,做大数据开发的工程师基本都遇到过,稍微调整一下内存配置即可。
本文简单记录一下,给读者参考,开发环境基于 Elasticsearch v1.7.5、Spark v1.6.2、elasticsearch-hadoop v2.1.0、Hadoop v2.7.1。
问题出现
使用 elasticsearch-hadoop 处理数据时,借用 Spark 框架,读取大量的数据到内存中【1.8 千万,41 GB】,由于内存参数设置太小,导致报内存错误。
异常信息如下:
1 | ExecutorLostFailure (executor 4 exited caused by one of the running tasks) Reason: Container killed by YARN for exceeding memory limits. 6.0 GB of 6 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead. |
重点看开头的那部分提示:
1 | ExecutorLostFailure (executor 4 exited caused by one of the running tasks) Reason: Container killed by YARN for exceeding memory limits. 6.0 GB of 6 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead. |
很明显,超过了物理内存 6 GB。
分析解决
主要是内存参数设置太小,不够存储数据 1.8 千万,加载到内存的大小大概是 41 GB。
当然,分散在集群的多个计算 Executor 节点上,每个节点都会处理一些【前提是数据均匀分布,无倾斜的现象】。
除了计算内存,还要考虑堆外内存,相关参数如下:
1 | spark.yarn.executor.memoryOverhead=2048 |
此外,关于资源分配的定义也要了解,以后才可以更好地设置参数:
1 | 资源定义分几个: |
解决办法当然很简单,增大内存配置即可,但是要注意不能盲目地增大,如果太消耗内存资源建议把数据分批处理。

