Spark 1.x 爆内存相关问题汇总及解
OOM
- # 包括GC Overhead limit
java.lang.OutOfMemoryError- # on yarn
- org.apache.hadoop.yarn.server.nodemanager.containermanager.monitor.ContainersMonitorImpl - Container [<edited>] is running beyond physical memory limits. Current usage: 18.0 GB of 18 GB physical memory used; 19.4 GB of 37.8 GB virtual memory used. Killing container.
- Container exit code: 137
- Task process exit with nonzero status of 137.
除了 exit code 137
外其它OOM提示都很明显,yarn container 137退出码按照SO的大神说:“Exit code 137 is a typical sign of the infamous OOM killer.”
解决方法:
- 加 executor 内存(spark.executor.memory),需注意on yarn时进程是按最小container memory的整数倍分配的。
- 优化程序内存占用
- 设置StorageLevel 到 DISK 或 MEMORY AND DISK,要注意persist只在action执行才生效,所以建议先count或isEmpty一下触发persist,然后再去做自己的flatMap/foreach等业务操作
Ref: hadoop-streaming-job-failure-task-process-exit-with-nonzero-status-of-137
Shuffle Read OOM
- org.apache.spark.shuffle.MetadataFetchFailedException: Missing an output location for shuffle 0
- org.apache.spark.shuffle.FetchFailedException: Failed to connect to ip-xxxxxxxx
- org.apache.spark.shuffle.FetchFailedException: Error in opening FileSegmentManagedBuffer
- java.io.FileNotFoundException of shuffle files in HDFS/S3
以上皆为可能的报错(但不代表报错一定就是OOM相关,要去找cause的exception;OOM不过是其中一种可能的cause),大致原因是shuffle后的executor读取数据超出了内存限制,然后挂了并且清除了相关的中间临时文件,其他的executor在尝试与其进行数据沟通时,要么executor丢失,要么无法读取其写出的shuffle文件等。当然FetchFailedException还有可能是其他原因,譬如某台机太繁忙无法响应等,这种情况可以尝试调整相关timeout参数进行尝试: spark.shuffle.io.maxRetries=6 ,spark.files.fetchTimeout=120s 。
如果你的单个shuffle block超过2g,然后又报类似以上列举的错误,你可能遭遇了以下 issue :
解决办法:
- 调大 repartition 数,减少每个repartition的size
- 调大executor内存
- on yarn的需调大 spark.executor.overheadMemory,按SO的说法,需要自己根据实际情况测试调到不报错为止。。
- 根据实际情况调整 spark.shuffle 的相关参数。shuffle参数中大多数是关于shuffle write和shuflling的配置,而且基本大多数默认都是比较优的配置了。唯一shuffle read相关的
spark.reducer.maxMbInFlight
涉及源码参见 Spark技术内幕: Shuffle详解(二) ,因为shuffle fetch阶段是边fetch边处理的,所以适当调小该值有助于改善shuffle阶段的内存占用。 shuffle部分参数说明 - 有可能也是你物理内存不够了,增加可用内存吧
- 优化数据结构使用,尽量使用原始类型和数组,泛型和对象会造成较大的传输和存储开销。可考虑利用一些高效的序列化方案,比如protostuff。
Ref:
what-are-the-likely-causes-of-org-apache-spark-shuffle-metadatafetchfailedexcept
fetchfailedexception-or-metadatafetchfailedexception-when-processing-big-data-set
Streaming OOM
- java.lang.Exception: Could not compute split, block input-0-1412705397200 not found
Spark Streaming 中此错误产生原因是streaming产生了堆积,超过了receiver可承受的内存大小,因此旧的未执行的job被删除来去接收新的job。
解决方法:
- 调大 receiver 内存
- kafka 直接消费没有做rdd transform的可考虑换 direct stream ,防止堆积。
- spark 1.6.x 可采用 spark.streaming.backpressure.enabled 机制回压,控制接收速率,防止爆内存。SparkConf设置
spark.streaming.backpressure.enabled=true
,spark.streaming.backpressure.pid.minrate=0.001
Ref:
Insufficient Physical Memory
- There is insufficient memory for the Java Runtime Environment to continue.
- Native memory allocation (malloc) failed to allocate 4088 bytes for AllocateHeap
- An error report file with more information is saved as:
其实就是没有足够的物理内存去启动这个JVM了,比如你JVM申请5g,实际只剩下4g可用的物理内存,就会报错,然后jvm启动失败进程退出。
解决方法:
- 加物理内存
- 优化程序和数据结构,调低jvm内存需求
- kill掉其他占用系统内存进程释放可用内存
问题:这里的可用内存包不包括操作系统cache的内存呢? (free -m
可查看OS的free和cached内存)
Ref : insufficient-memory-for-the-java-runtime-environment-message-in-eclipse
其实以上的很多解决办法基本是OOM大多数问题通用的,比如持久化、内存调大、数据结构优化。
如果以上问题还不能解决,请参考:http://spark.apache.org/docs/latest/tuning.html 中的 Memory Tuning部分
Spark 1.x 爆内存相关问题汇总及解的更多相关文章
- Spark内核| 调度策略| SparkShuffle| 内存管理| 内存空间分配| 核心组件
1. 调度策略 TaskScheduler会先把DAGScheduler给过来的TaskSet封装成TaskSetManager扔到任务队列里,然后再从任务队列里按照一定的规则把它们取出来在Sched ...
- 大礼包!ANDROID内存优化(大汇总)
写在最前: 本文的思路主要借鉴了2014年AnDevCon开发者大会的一个演讲PPT,加上把网上搜集的各种内存零散知识点进行汇总.挑选.简化后整理而成. 所以我将本文定义为一个工具类的文章,如果你在A ...
- ANDROID内存优化——大汇总(转)
原文作者博客:转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! ANDROID内存优化(大汇总——上) 写在最前: 本文的思路主要借鉴了20 ...
- ANDROID内存优化(大汇总——中)
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 写在最前: 本文的思路主要借鉴了2014年AnDevCon开发者大会的一个演讲PPT,加上 ...
- ANDROID内存优化(大汇总——上)
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 写在最前: 本文的思路主要借鉴了2014年AnDevCon开发者大会的一个演讲PPT,加上 ...
- [转帖]xserver相关知识汇总
xserver相关知识汇总 https://blog.csdn.net/QTVLC/article/details/81739984 本文主要是从以下几个方面介绍xorg-xserver 相关的知 ...
- Android开发环境——模拟器AVD相关内容汇总
Android开发环境将分为SDK相关内容.Eclipse ADT相关内容.模拟器AVD相关内容.调试器DDMS相关内容.日志LogCat相关内容.连接驱动ADB相关内容.内存泄露检测工具MAT相关 ...
- Android开发环境——Eclipse ADT相关内容汇总
Android开发环境将分为SDK相关内容.Eclipse ADT相关内容.模拟器AVD相关内容.调试器DDMS相关内容.日志LogCat相关内容.连接驱动ADB相关内容.内存泄露检测工具MAT相关 ...
- spark or sparkstreaming的内存泄露问题?
关于sparkstreaming的无法正常产生数据---->到崩溃---->到数据读写极为缓慢(或块丢失?)问题 前两阶段请看我的博客:https://www.cnblogs.com/wa ...
随机推荐
- js/jquery如何获取获取父窗口的元素
1.$("#父窗口元素ID",window.parent.document); 对应javascript版本为 window.parent.document.getElementB ...
- Maven+SpringMVC+SpringFox+Swagger整合示例
查考链接:https://my.oschina.net/wangmengjun/blog/907679 coding地址:https://git.coding.net/conding_hjy/Spri ...
- BeautifulSoup下Unicode乱码解决
今天在用scrapy爬某个网站的数据,其中DOM解析我用的是BeautifulSoup,速度上没有XPath来得快,不过因为用了习惯了,所以一直用的bs,版本是bs4 不过在爬取过程中遇到了一些问题, ...
- python全栈开发day62-两表操作增删改查,外键,if else模板语法
一.今日内容总结: day62 内容回顾: 1. django有关所有命令: pip install django==1.11.14 django-admin startproject 项目名称 cd ...
- HDU1507 Uncle Tom's Inherited Land* 二分图匹配 匈牙利算法 黑白染色
原文链接http://www.cnblogs.com/zhouzhendong/p/8254062.html 题目传送门 - HDU1507 题意概括 有一个n*m的棋盘,有些点是废的. 现在让你用1 ...
- ELK安装(windows)
一.安装JAVA环境 在Oracle官网获取最新版的Java版本,官网:http://www.oracle.com/ 安装完成后,配置JAVA_HOME和JRE_HOME. 二.下载安装ELK htt ...
- Python argparse 模块
Python argparse 模块 test.py: import argparse argparser = argparse.ArgumentParser(add_help=False) argp ...
- JavaEE 之 Mybatis
1.Mybatis a.定义:MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架 b.步骤: ①在src下创建 SqlMapConfig.xml 及 datasource.pr ...
- 使用PHPStorm 配置自定义的Apache与PHP环境
使用PHPStorm 配置自定义的Apache与PHP环境之一 关于phpstorm配置php开发环境,大多数资料都是直接推荐安装wapmserver.而对于如何配置自定义的PHP环境和Apach ...
- Stall Reservations POJ - 3190(贪心)
Oh those picky N (1 <= N <= 50,000) cows! They are so picky that each one will only be milked ...