Spark 驱动程序堆内存问题

Posted

技术标签:

【中文标题】Spark 驱动程序堆内存问题【英文标题】:Spark Driver Heap Memory Issues 【发布时间】:2016-12-15 17:59:21 【问题描述】:

我看到主节点上的 Java 堆慢慢用完的问题。下面是我创建的一个简单示例,它只会重复 200 次。使用下面的设置,master 在大约 1 小时内耗尽内存并出现以下错误:

16/12/15 17:55:46 INFO YarnSchedulerBackend$YarnDriverEndpoint: Launching task 97578 on executor id: 9 hostname: ip-xxx-xxx-xx-xx
#
# java.lang.OutOfMemoryError: Java heap space
# -XX:OnOutOfMemoryError="kill -9 %p"
#   Executing /bin/sh -c "kill -9 20160"...

代码:

import org.apache.spark.sql.functions._
import org.apache.spark._

object MemTest 

 case class X(colval: Long, colname: Long, ID: Long)

 def main(args: Array[String]) 
    val conf = new SparkConf().setAppName("MemTest")
    val spark = new SparkContext(conf)

    val sc = org.apache.spark.sql.SQLContext.getOrCreate(spark)
    import sc.implicits._;

    for( a <- 1 to 200)
    
      var df = spark.parallelize((1 to 5000000).map(x => X(x.toLong, x.toLong % 10, x.toLong / 10 ))).toDF()
      df = df.groupBy("ID").pivot("colname").agg(max("colval"))
      df.count
    

    spark.stop()
  

我正在使用 m4.xlarge(4 个节点+1 个主节点)在 AWS emr-5.1.0 上运行。这是我的火花设置


  "Classification": "spark-defaults",
  "Properties": 
    "spark.dynamicAllocation.enabled": "false",
    "spark.executor.instances": "16",
    "spark.executor.memory": "2560m",
    "spark.driver.memory": "768m",
    "spark.executor.cores": "1"
  
,

    "Classification": "spark",
    "Properties": 
      "maximizeResourceAllocation": "false"
    
,

我使用 sbt 编译

name := "Simple Project"

version := "1.0"

scalaVersion := "2.11.7"

libraryDependencies ++= Seq(
  "org.apache.spark" %% "spark-core" % "2.0.2" % "provided",
  "org.apache.spark" %% "spark-sql" % "2.0.2")

然后使用

运行它
spark-submit --class MemTest target/scala-2.11/simple-project_2.11-1.0.jar

jmap -histo查看内存我看到java.lang.Longscala.Tuple2不断增长。

【问题讨论】:

【参考方案1】:

你确定集群上安装的spark版本是2.0.2吗?

或者,如果您的集群上有多个 Spark 安装,您确定您调用的是正确的 (2.0.2) spark-submit?

(很遗憾,我无法发表评论,所以这就是我将其发布为答案的原因)

【讨论】:

这是 Spark 2.0.1,因为这就是 emr-5.1.0。我会试试 emr-5.2.0。

以上是关于Spark 驱动程序堆内存问题的主要内容,如果未能解决你的问题,请参考以下文章

基于堆外内存存储提升Spark内存资源使用效率

Spark开发-Spark内存溢出原因以及解决方式

使用 Kafka 直接流在 Yarn 上引发堆内存泄漏

在 takeSample 上 Spark 作业的堆内存不足

Spark内存分数与年轻一代/老一代java堆拆分

spark - 在大型数据帧上执行 groupby 和聚合时,java 堆内存不足