OutOfMemoryError:Spark中的Java堆空间

时间:2018-05-22 20:28:53

标签: apache-spark pyspark

我在内存问题方面遇到了一些问题,但我无法解决。任何帮助都非常感谢。 我是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 个答案:

答案 0 :(得分:0)

尝试使用:

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