执行Spark任务过程中,遇到Container Killed by Yarn For Exceeding Memory Limits怎么办?
出现这个错误意味着Spark处理数据过程中,处理的数据超过在driver端或者executor端的分配的内存,有如下方式解决这个问题
1、先看下数据的分布情况。处理的数据有倾斜,就是当前数据,当前分区规则,导致一个Task分配了过多的数据。这种场景需要检查数据,自定义个分区策略能够分散每个Task的数据
2、另一种原因就是Shuffle过程中,executor拉取大量数据超出executor的内存限制。
- 看看数据任务,能否先将数据聚合,然后在拉取。比如讲groupByKey算子用reduceByKey代替
- 如果shuffle大量数据不能避免,就需要修改executor的内存配置(接下来介绍)
按上述两种方式仍然不能解决的问题的话。接下来该怎么办
a、增加Memory Overhead配置
按照任务报错信息会有类似信息“"Container killed by YARN for exceeding memory limits..... Consider boosting spark.yarn.executor.memoryOverhead.”。
那么spark.yarn.executor.memoryOverhead关于什么呢。官网对于spark.yarn.executor.memoryOverhead的解释
The amount of off-heap memory (in megabytes) to be allocated per executor. This is memory that accounts for things like VM overheads, interned strings, other native overheads, etc. This tends to grow with the executor size (typically 6-10%).
为每个executor分配的堆外内存,此部分内存主要用于JVM自身,interned字符串, NIO Buffer(Driect Buffer)等开销。默认值:executorMemory * 0.10, with minimum of 384
解决Container Killed by Yarn For Exceeding Memory Limits错误。尝试逐渐增加spark.driver/executor.memoryOverhead。
需要注意的是,spark.driver/executor.memory和spark.driver/executor.memoryOverhead不能超过node节点内存配置yarn.nodemanager.resource.memory-mb
spark.driver/executor.memory + spark.driver/executor.memoryOverhead < yarn.nodemanager.resource.memory-mb
sudo vim /etc/spark/conf/spark-defaults.conf
spark.driver.memoryOverhead 1024
spark.executor.memoryOverhead 1024
- 2、也可以提交单个任务,特别指定该参数
spark-submit --class org.apache.spark.examples.WordCount --master yarn --deploy-mode cluster --conf spark.driver.memoryOverhead=512 --conf spark.executor.memoryOverhead=512 <path/to/jar>
- 3、如果是Hive的场景,也可以通过SET变量的方式
set spark.yarn.driver.memoryOverhead=512;
set spark.yarn.executor.memoryOverhead=512;
工作当中,大部分场景我都通过修改Memory Overhead参数解决该问题,如果没有解决该怎么办呢。
b、减少Executor核数(Executor Cores)
一个Executor的核数分配多,同时执行的Task多的话势必对Executor的内存需求增加。所以我们减少Core的个数尝试解决问题。
同样有三种方式修改Executor核数,分别是修改全局配置、提交任务时指定配置、Hive场景通过SET变量方式
- 修改全局配置
sudo vim /etc/spark/conf/spark-defaults.conf
spark.driver.cores 3
spark.executor.cores 3
- 提交任务时指定配置
spark-submit --class org.apache.spark.examples.WordCount --master yarn --deploy-mode cluster --executor-cores 5 --driver-cores 4 <path/to/jar>
- Hive场景通过SET变量方式
SET spark.driver.cores=3;
SET spark.executor.cores=3;
c、增加分区数(Partitions)
增加分区数,其实对应这文章开头的第1种打散数据的解决方式。原始弹性分布式数据集增加 spark.default.parallelism 的值,或执行 .repartition() 操作。当每个Task处理的数据相对较小的情况下。就不会出现内存不够的情况
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。