当前位置: 首页 > 知识库问答 >
问题:

spark sql:读取拼花地板分区文件时超出了GC开销限制

梁骞仕
2023-03-14

我尝试从hdfs读取现有的拼花文件使用火花sql为我的POC,但击中OOM错误。

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

  1. 日期文件夹下有1200个子文件夹

拼花文件夹结构

  • 日期:
    • 文件\u dir\u 1
      • 文件\u 1。拼花地板
      • 文件2。拼花地板
      • 文件\u 3。拼花地板
      • 文件\u 3。拼花地板

      当我尝试读取特定日期的文件时,上面提到的数字会引发ession.read()。模式(一些模式)。拼花(hdfs_path_folder/日期=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)
      

共有1个答案

金瑞
2023-03-14

当spark尝试从拼花地板读取数据时,它会在内部尝试构建InMemoryFileIndex

在火花工作中,我们会看到这样的工作

Listing leaf files and directories for 1200 paths:

此问题是因为要扫描的路径数太大

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

 'driver.cores': 4,
 'driver.memory': '8g'
 类似资料:
  • 我正在从Impala迁移到SparkSQL,使用以下代码读取一个表: 我如何调用上面的SparkSQL,这样它就可以返回这样的东西:

  • 我正在尝试使用Apache POI读取一个具有2G堆内存的简单8MB文件。但我正在摆脱记忆错误。 以下是生成问题的代码: 我不认为这个操作需要这么多内存,我知道有很多问题要问,但我尝试了很多事情?

  • 问题内容: 我正在尝试建立一个包含2台服务器的Gridgain集群。 使用 GridDataLoader 将.csv文件中的数据(100万至5000万个数据)加载到Gridgain 。 从加载的数据中找到最小值,最大值,平均值等, 当在Eclipse中作为独立应用程序运行时,我得到正确的输出。 但是,在建立集群(eclipse环境中的2个服务器中的2个节点+我的Eclipse环境中的1个节点)的同

  • 问题内容: 我在一个程序中创建了这个错误,该程序创建了几个(数十万)HashMap对象,每个对象都有几个(15-20)文本条目。这些字符串必须全部收集(不分解成较小的数量),然后再提交给数据库。 根据Sun的说法,该错误发生“如果在垃圾回收上花费了太多时间:如果在垃圾回收上花费了总时间的98%以上,而回收不到2%的堆,则将引发OutOfMemoryError。 ”。 显然,可以使用命令行将参数传递

  • 问题内容: 我收到 java.lang.OutOfMemoryError: 在Android 1.4上运行gradle时, 超出了GC开销限制 …这是我的依赖: 如何解决? 问题答案: 将此添加到您的android闭包(构建gradle): 这样可以解决您的问题。不过,如果您遇到问题,请参见以下链接 GC开销限制超出错误

  • 问题内容: 这是构建过程停止的错误消息,它表示尝试使用Java选项“ -Xmx”增加堆大小,但是在构建android源代码时我不知道如何配置它。 问题答案: 似乎Android生成文件中的错误-3500 MB的内存不足以在Android内部构建某些Java软件包。它是硬编码的值,您可以在build / core / config.mk中 找到它。现在,您可以在本地简单地增加它(但是很奇怪,它没有放