开发者社区> 问答> 正文

spark中如何防止driver端的内存溢出?

spark中如何防止driver端的内存溢出?

展开
收起
芯在这 2021-12-11 22:30:56 1130 0
1 条回答
写回答
取消 提交回答
  • 可以增大driver的内存参数:spark.driver.memory (default 1g)

    这个参数用来设置Driver的内存。在Spark程序中,SparkContext,DAGScheduler都是运行在Driver端的。对应rdd的Stage切分也是在Driver端运行,如果用户自己写的程序有过多的步骤,切分出过多的Stage,这部分信息消耗的是Driver的内存,这个时候就需要调大Driver的内存。

    map过程产生大量对象导致内存溢出

    这种溢出的原因是在单个map中产生了大量的对象导致的,例如:rdd.map(x=>for(i <- 1 to 10000) yield i.toString),这个操作在rdd中,每个对象都产生了10000个对象,这肯定很容易产生内存溢出的问题。针对这种问题,在不增加内存的情况下,可以通过减少每个Task的大小,以便达到每个Task即使产生大量的对象Executor的内存也能够装得下。具体做法可以在会产生大量对象的map操作之前调用repartition方法,分区成更小的块传入map。例如:rdd.repartition(10000).map(x=>for(i <- 1 to 10000) yield i.toString)。

    面对这种问题注意,不能使用rdd.coalesce方法,这个方法只能减少分区,不能增加分区, 不会有shuffle的过程。

    2021-12-11 22:31:18
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Apache Spark: Cloud and On-Prem 立即下载
Hybrid Cloud and Apache Spark 立即下载
云服务器ECS内存增强型实例re6全新发布 立即下载