Spark中的OOM问题有哪些?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
1、map类型的算子执行中内存溢出如flatMap,mapPatitions
(1)原因:map端过程产生大量对象导致内存溢出:这种溢出的原因是在单个map中产生了大量的对象导致的针对这种问题。
(2)解决方案:
1)增加堆内内存。
2)在不增加内存的情况下,可以减少每个Task处理数据量,使每个Task产生大量的对象时,Executor的内存也能够装得下。具体做法可以在会产生大量对象的map操作之前调用repartition方法,分区成更小的块传入map。
2、shuffle后内存溢出如join,reduceByKey,repartition。
shuffle内存溢出的情况可以说都是shuffle后,单个文件过大导致的。在shuffle的使用,需要传入一个partitioner,大部分Spark中的shuffle操作,默认的partitioner都是HashPatitioner,默认值是父RDD中最大的分区数.这个参数spark.default.parallelism只对HashPartitioner有效.如果是别的partitioner导致的shuffle内存溢出就需要重写partitioner代码了.
3、driver内存溢出
(1)用户在Dirver端口生成大对象,比如创建了一个大的集合数据结构。解决方案:将大对象转换成Executor端加载,比如调用sc.textfile或者评估大对象占用的内存,增加dirver端的内存
(2)从Executor端收集数据(collect)回Dirver端,建议将driver端对collect回来的数据所作的操作,转换成executor端rdd操作。