【问题标题】:Spark wholeTextFiles(): java.lang.OutOfMemoryError: Java heap spaceSpark WholeTextFiles():java.lang.OutOfMemoryError:Java堆空间
【发布时间】:2017-10-21 23:19:42
【问题描述】:

我正在使用spark.wholeTextFiles() 处理一个 400MB 的文件,并且我不断出现内存不足错误。我首先将这个 API 与一个总共有 40MB 的文件文件夹一起使用,我想知道我的代码是否适用于大文件,这就是大文件的来源。

这是配置,我想我为堆提供了足够的 RAM,但仍然没有运气,我只是在读取文件夹,然后用

写下来
files.saveAsTextFile("data/output/no")

命令是

spark-submit --driver-memory 4G --driver-java-options -Xms4096m --executor-memory 4G 目标/scala-2.11/mz_2.11-1.0.jar

我比较了 spark sql,sc.hadoopFilesc.wholeTextFileswholeTextFiles 是最快的,我认为这是因为 wholeTextFiles 试图将整个文件夹加载到一个节点的内存中,主节点我想一切都发生在 RAM 上,所以它很快。

HadoopFile() 按分区加载,与文件数量一样多,即使文件很小且此读取操作代价高昂。

spark sql 将文件夹加载到分区,分区大小可以用

定义
spark.conf.set("spark.sql.files.maxPartitionBytes", 32000000)

但如果文件很小,将文件收费到每个分区需要时间。

第一季度。为什么我总是出现内存不足错误?

第二季度。当火花按分区加载文件夹/大文件并返回RDD时,如何 许多分区已被读入RAM?也许不是,火花等待 action 加载与 执行者(或核心?)每次处理?在那种情况下,也许我们应该 加载像 64MB 或 128MB 这样的大分区,而不是像这样的小分区 32kb?

【问题讨论】:

    标签: apache-spark jvm out-of-memory apache-spark-sql


    【解决方案1】:

    你能请完整的代码吗?

    wholeTextFile() 在需要 filePathfileContent 时使用。 key -> filePath (C:\\fileName) 和 value -> 实际文件内容。

    使用wholeTextFile()时的分区数取决于你有多少个executor core。 这里的分区数将是 1 个或更多。

    除非调用了一个动作,否则不会触发火花作业。 这是一种自下而上的方法/惰性评估。

    【讨论】:

      猜你喜欢
      • 2014-02-04
      • 2018-12-07
      • 1970-01-01
      • 2015-09-28
      • 2016-03-02
      • 1970-01-01
      • 2010-12-08
      相关资源
      最近更新 更多