【问题标题】:spark sql : GC overhead limit exceeded when reading parquet partitioned filesspark sql:读取镶木地板分区文件时超出了 GC 开销限制
【发布时间】:2018-10-25 11:39:19
【问题描述】:

我正在尝试为我的 POC 使用 spark sql 从 hdfs 读取现有 parquet 文件,但遇到 OOM 错误。

对于给定的分区日期,我需要读取所有已分区的文件。分区如下:date/file_dir_id

  1. 日期文件夹下有1200个子文件夹
  2. 所有这些文件夹下总共有 234769 个 .parquet 文件(不是很大)
  3. 所有 .parquet 文件的总大小为 10g

Parquet 文件夹结构

  1. 日期
    • 文件目录_1
      • File_1.parquet
      • File_2.parquet
    • File_dir_2
      • File_3.parquet
      • File_3.parquet

当我尝试读取特定日期的文件时,上面提到的数字 sparkSession.read().schema(someSchema).parquet(hdfs_path_folder/date=2018-03-05/*); // 我得到下面提到的错误。

其他细节

  1. 以纱线/集群模式运行
  2. 火花 2.3
  3. 4 节点集群(32 核/128 GB)
  4. 5 个执行器/每个 4 个核心

如果我增加驱动程序内存或执行程序内存没有帮助。请帮助解决这个问题?

错误详情

java.lang.OutOfMemoryError: GC overhead limit exceeded
at java.util.Arrays.copyOf(Unknown Source)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(Unknown Source)
at java.lang.AbstractStringBuilder.append(Unknown Source)
at java.lang.StringBuffer.append(Unknown Source)
at java.net.URI.appendSchemeSpecificPart(Unknown Source)
at java.net.URI.toString(Unknown Source)
at java.net.URI.<init>(Unknown Source)
at org.apache.hadoop.fs.Path.initialize(Path.java:203)
at org.apache.hadoop.fs.Path.<init>(Path.java:172)
at org.apache.spark.sql.execution.datasources.InMemoryFileIndex$$anonfun$org$apache$spark$sql$execution$datasources$InMemoryFileIndex$$bulkListLeafFiles$3$$anonfun$7.apply(InMemoryFileIndex.scala:235)
at org.apache.spark.sql.execution.datasources.InMemoryFileIndex$$anonfun$org$apache$spark$sql$execution$datasources$InMemoryFileIndex$$bulkListLeafFiles$3$$anonfun$7.apply(InMemoryFileIndex.scala:228)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
at scala.collection.mutable.ArraySeq.foreach(ArraySeq.scala:74)
at scala.collection.TraversableLike$class.map(TraversableLike.scala:234)
at scala.collection.AbstractTraversable.map(Traversable.scala:104)
at org.apache.spark.sql.execution.datasources.InMemoryFileIndex$$anonfun$org$apache$spark$sql$execution$datasources$InMemoryFileIndex$$bulkListLeafFiles$3.apply(InMemoryFileIndex.scala:228)
at org.apache.spark.sql.execution.datasources.InMemoryFileIndex$$anonfun$org$apache$spark$sql$execution$datasources$InMemoryFileIndex$$bulkListLeafFiles$3.apply(InMemoryFileIndex.scala:227)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:186)
at scala.collection.TraversableLike$class.map(TraversableLike.scala:234)
at scala.collection.mutable.ArrayOps$ofRef.map(ArrayOps.scala:186)
at org.apache.spark.sql.execution.datasources.InMemoryFileIndex$.org$apache$spark$sql$execution$datasources$InMemoryFileIndex$$bulkListLeafFiles(InMemoryFileIndex.scala:227)
at org.apache.spark.sql.execution.datasources.InMemoryFileIndex$.org$apache$spark$sql$execution$datasources$InMemoryFileIndex$$listLeafFiles(InMemoryFileIndex.scala:273)
at org.apache.spark.sql.execution.datasources.InMemoryFileIndex$$anonfun$org$apache$spark$sql$execution$datasources$InMemoryFileIndex$$bulkListLeafFiles$1.apply(InMemoryFileIndex.scala:172)
at org.apache.spark.sql.execution.datasources.InMemoryFileIndex$$anonfun$org$apache$spark$sql$execution$datasources$InMemoryFileIndex$$bulkListLeafFiles$1.apply(InMemoryFileIndex.scala:171)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
at scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59)
at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48)

【问题讨论】:

  • 也遇到了这个问题;驱动程序似乎有足够的内存,GC 日志看起来很正常。不知道发生了什么?
  • 你解决了这个问题吗?,面临同样的问题

标签: apache-spark


【解决方案1】:

当 spark 尝试从 parquet 读取数据时,它会在内部尝试构建一个 InMemoryFileIndex

在spark job中,我们会看到一个类似的job

Listing leaf files and directories for 1200 paths:

这个问题是因为要扫描的路径数量太大

增加驱动内存和内核为我解决问题

 'driver.cores': 4,
 'driver.memory': '8g'

【讨论】:

    猜你喜欢
    • 2021-02-04
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 2018-11-22
    • 2022-01-01
    • 1970-01-01
    相关资源
    最近更新 更多