pyspark 内存不足错误:Spark中的Java堆空间

2w3kk1z5  于 2023-01-01  发布在  Spark
关注(0)|答案(1)|浏览(455)

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

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

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

java.lang.OutOfMemoryError : Java heap space

我需要以RDD的形式获取JSON数据,然后使用SQL Spark进行操作和分析。但是我在第一步(读取JSON)本身就得到了错误。我意识到要读取如此大的文件,需要对Spark会话的配置进行必要的更改。我按照Apache Spark: Job aborted due to stage failure: "TID x failed for unknown reasons"和Spark java.lang.OutOfMemoryError给出的答案进行了操作:Java堆空间
我试图改变我的SparkSession的配置,但我想我可能误解了一些设置。以下是我的spark配置。

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

我为驱动程序内存和执行器内存等不同参数设置的值是否有错误?另外,我是否需要设置更多的配置参数?

rsl1atfo

rsl1atfo1#

尝试使用:

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

这是由于在太小的分区之间移动数据和内存开销导致将所有分区放在堆内存中。
我的建议是将spark.sql.shuffle.partitions值减小到最小,并尝试使用重新分区或并行来增加输入/中间 Dataframe 的分区。

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

相关问题