OutOfMemoryError : Spark 中的 Java 堆空间

Posted

技术标签:

【中文标题】OutOfMemoryError : Spark 中的 Java 堆空间【英文标题】:OutOfMemoryError : Java heap space in Spark 【发布时间】:2018-05-22 20:28:53 【问题描述】:

我在内存问题上遇到了一些问题,但我无法解决。非常感谢任何帮助。 我是 Spark 和 pyspark 功能的新手,我试图读取一个大小约为 5GB 的大型 JSON 文件并使用

构建 rdd
df = spark.read.json("example.json")

每次运行上述语句时,都会出现以下错误:

java.lang.OutOfMemoryError : Java heap space

我需要以 RDD 的形式获取 JSON 数据,然后使用 SQL Spark 进行操作和分析。但是我在第一步(读取 JSON)本身就出错了。 我知道要读取如此大的文件,需要对 Spark Session 的配置进行必要的更改。 我按照Apache Spark: Job aborted due to stage failure: "TID x failed for unknown reasons"给出的答案 和Spark java.lang.OutOfMemoryError: Java heap space

我尝试更改 SparkSession 的配置,但我想我可能误解了某些设置。以下是我的火花配置。

spark = SparkSession \
.builder \
.appName("Python Spark SQL basic example") \
.config("spark.memory.fraction", 0.8) \
.config("spark.executor.memory", "14g") \
.config("spark.driver.memory", "12g")\
.config("spark.sql.shuffle.partitions" , "8000") \
.getOrCreate()

我为驱动程序内存和执行程序内存等不同参数设置的值是否有任何错误。除了这个,我还需要设置更多的配置参数吗?

【问题讨论】:

你是在那个 DataFrame 上调用 .collect() 还是 .show() 我想,一旦我创建了 RDD df。 尝试在 hdfs 中使用您的 json 文件。 读取 JSON 文件后调用的操作是什么?如果不是,错误何时发生?它是普通的文本文件还是压缩文件?另外,请尝试不要在您的问题中设置spark.memory.fraction 和edit 的详细信息。谢谢。 如果您可以拆分原始 JSON 文件(希望它是一个数组),请执行此操作,然后将拆分放在一个文件夹中,然后读取该文件夹。希望你有一个工具来分割这么大的文件,我只需要分割一个 500Mb 的文件,所以我使用了 Python。 【参考方案1】:

尝试使用:

df = spark.read.json("example.json").repartition(100)

这是由于在太小的分区之间洗牌数据和内存开销将所有分区都放在堆内存中。

我的建议是将spark.sql.shuffle.partitions 值减小到最小,并尝试使用重新分区或并行性来增加输入/中间数据帧的分区。

spark = SparkSession \
  .builder \
  .appName("Python Spark SQL basic example") \
  .config("spark.memory.fraction", 0.8) \
  .config("spark.executor.memory", "14g") \
  .config("spark.driver.memory", "12g")\
  .config("spark.sql.shuffle.partitions" , "800") \
  .getOrCreate()

【讨论】:

以上是关于OutOfMemoryError : Spark 中的 Java 堆空间的主要内容,如果未能解决你的问题,请参考以下文章

遇到的问题---spark---spark OutOfMemoryError: Java heap space

Spark java.lang.OutOfMemoryError:Java 堆空间

为啥由于 java.lang.OutOfMemoryError,Spark Streaming 在字符串解码时失败?

spark-submit java.lang.OutOfMemoryError: Java heap space

Spark DataFrame java.lang.OutOfMemoryError:长循环运行时超出了GC开销限制

Spark - ERROR Executor: Exception in tjava.lang.OutOfMemoryError: unable to create new native thread