OutOfMemoryError:Spark中的Java堆空间

我在内存问题上面临一些问题,但我无法解决 . 任何帮助都非常感谢 . 我是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()

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

回答(1)

2 years ago

尝试使用:

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()