没有合适的资源?快使用搜索试试~ 我知道了~
Spark面对OOM问题的解决方法及优化总结1
需积分: 0 2 下载量 89 浏览量
2022-08-08
22:40:41
上传
评论
收藏 299KB DOCX 举报
温馨提示
试读
6页
2.数据不平衡导致内存溢出: 数据不平衡除了有可能导致内存溢出外,也有可能导致性能的问题,解决方法和上面说的类似,就是调用repartition重新分区
资源推荐
资源详情
资源评论
Spark 面对 OOM 问题的解决方法及优化总结
Spark 中的 OOM 问题不外乎以下两种情况
� map 执行中内存溢出
� shuffle 后内存溢出
map 执行中内存溢出代表了所有 map 类型的操作,包括:flatMap,filter,
mapPatitions 等。shuffle 后内存溢出的 shuffle 操作包括 join,reduceByKey,
repartition 等操作。后面先总结一下我对 Spark 内存模型的理解,再总结各种 OOM 的情况
相对应的解决办法和性能优化方面的总结。如果理解有错,希望在评论中指出。
Spark 内存模型:
Spark 在一个 Executor 中的内存分为三块,一块是 execution 内存,一块是 storage 内
存,一块是 other 内存。
� execution 内存是执行内存,文档中说 join,aggregate 都在这部分内存中执行,
shuffle 的数据也会先缓存在这个内存中,满了再写入磁盘,能够减少 IO。其实 map 过
程也是在这个内存中执行的。
� storage 内存是存储 broadcast,cache,persist 数据的地方。
� other 内存是程序执行时预留给自己的内存。
execution 和 storage 是 Spark Executor 中内存的大户,other 占用内存相对少很多,
这里就不说了。在 spark-1.6.0 以前的版本,execution 和 storage 的内存分配是固定的,
使用的参数配置分别是 spark.shuffle.memoryFraction(execution 内存占 Executor 总内
存大小,default 0.2)和 spark.storage.memoryFraction(storage 内存占 Executor 内
存大小,default 0.6),因为是 1.6.0 以前这两块内存是互相隔离的,这就导致了 Executor
的内存利用率不高,而且需要根据 Application 的具体情况,使用者自己来调节这两个参数才
能优化 Spark 的内存使用。在 spark-1.6.0 以上的版本,execution 内存和 storage 内存可
以相互借用,提高了内存的 Spark 中内存的使用率,同时也减少了 OOM 的情况。
在 Spark-1.6.0 后加入了堆外内存,进一步优化了 Spark 的内存使用,堆外内存使用
JVM 堆以外的内存,不会被 gc 回收,可以减少频繁的 full gc,所以在 Spark 程序中,会长
时间逗留再 Spark 程序中的大内存对象可以使用堆外内存存储。使用堆外内存有两种方式,一
种是在 rdd 调用 persist 的时候传入参数 StorageLevel.OFF_HEAP,这种使用方式需要配合
Tachyon 一起使用。另外一种是使用 Spark 自带的 spark.memory.offHeap.enabled 配置
为 true 进行使用,但是这种方式在 1.6.0 的版本还不支持使用,只是多了这个参数,在以后
的版本中会开放。
OOM 的问题通常出现在 execution 这块内存中,因为 storage 这块内存在存放数据满了
之后,会直接丢弃内存中旧的数据,对性能有影响但是不会有 OOM 的问题。
内存溢出解决方法:
1. map 过程产生大量对象导致内存溢出:
资源评论
行走的瓶子Yolo
- 粉丝: 30
- 资源: 343
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功