多语言展示
当前在线:934今日阅读:176今日分享:34

spark如何防止内存溢出

Spark 是专为大规模数据处理而设计的快速通用的计算引擎,可用它来完成各种各样的运算,包括 SQL 查询、文本处理、机器学习等,那么如何防止内存溢出呢?
工具/原料

Spark

方法/步骤
1

Spark在一个Executor中的内存分为三块,一块是execution内存,一块是storage内存,一块是other内存。

2

map过程产生大量对象导致内存溢出,单个map中产生了大量的对象容易导致内存溢出。面对这种问题不能使用rdd.coalesce方法,这个方法只能减少分区,不能增加分区,不会有shuffle的过程。

3

数据不平衡导致内存溢出,也有可能导致性能的问题,此时调用repartition重新分区即可。

4

coalesce调用导致内存溢出,令程序按照我们想的先执行100个Task再将结果合并成10个文件,这个问题同样可以通过repartition解决,调用repartition(10)。

5

shuffle内存溢出的情况可以说都是shuffle后,单个文件过大导致的。在Spark中,join,reduceByKey这一类型的过程,都会有shuffle的过程,在shuffle的使用,需要传入一个partitioner。

6

standalone模式下资源分配不均匀导致内存溢出,同时配置–executor-cores或者spark.executor.cores参数,确保Executor资源分配均匀。

7

在RDD中,共用对象能够减少OOM的情况。

注意事项
1

使用mapPartitions代替大部分map操作,或者连续使用的map操作。

2

先filter在join,shuffle的数据量会减少。

推荐信息