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

尽管文件大小超过了执行器的内存,但如何使用一个分区将数据帧写入csv文件

龙德润
2023-03-14

我正在使用Apache Spark独立集群,有2个执行器,每个执行器有1g堆空间和8个内核。

我将大小为2.7Gb的输入文件加载到数据帧df中。这是使用21个任务成功完成的,也就是说,我在整个集群中总共使用了21个分区。

现在我试着只使用1个分区将其写到csv,这样我就可以在1个csv文件中获得所有记录。

df.coalesce(1).write.option("header","true").csv("output.csv")

我预计会出现OOM错误,因为一个执行程序的总可用内存少于2.7Gb。

尽管数据大于单个分区,但我的任务如何没有中断?引擎盖下到底发生了什么?

共有1个答案

壤驷穆冉
2023-03-14

原始 csv 文件的大小为 2.7GB,其原始格式(基于文本,无压缩)。当您使用 Spark 读取该文件时,它会根据配置 spark.files.maxPartitionBytes 将数据拆分为多个分区,默认为 128MB。进行数学运算会导致 2700MB / 128MB = 21 个分区

Spark将数据保存在内存中,但采用自己的存储格式,称为“矢量化拼花”,并使用默认压缩“lz4”。

因此,2.7GB将适合提供的1GB内存。

请记住,并非100%的1GB都可用于数据存储/处理。执行器存储器有一个清晰的设计,可通过配置< code > spark . memory . fraction 和< code > spark . memory . storage fraction 进行配置。我在medium上写过一篇关于Executor内存布局的文章。

这是一张有助于理解内存布局的图片:

 类似资料:
  • 问题内容: 如何将大数据文件分块写入CSV文件? 我有一组大型数据文件(1M行x 20列)。但是,我只关注该数据的5列左右。 我想通过只用感兴趣的列制作这些文件的副本来使事情变得更容易,所以我可以使用较小的文件进行后期处理。因此,我计划将文件读取到数据帧中,然后写入csv文件。 我一直在研究将大数据文件以块的形式读入数据框。但是,我还无法找到有关如何将数据分块写入csv文件的任何信息。 这是我现在

  • 我在pandas中有一个数据帧,我想把它写到CSV文件中。我使用的是: 并得到错误: 有没有什么方法可以很容易地解决这个问题(例如,我的数据帧中有unicode字符)?还有,有没有一种方法可以使用“to-tab”方法(我认为不存在)写入以制表符分隔的文件,而不是CSV?

  • 我正在使用Spark 2.3,我需要将Spark数据帧保存到csv文件中,我正在寻找更好的方法。。查看相关/类似的问题,我发现了这个问题,但我需要一个更具体的: 如果DataFrame太大,如何避免使用Pandas?因为我使用了函数(下面的代码),它产生了: 内存不足错误(无法分配内存)。 使用文件I/O直接写入csv是更好的方法吗?它可以保留分隔符吗? 使用df。聚结(1)。写选项(“标题”、“

  • 我正在尝试将以下数据写入csv文件。这些数据是employdetails name1-surname1-place1 名称4-surname4-place4 我希望输出在CSV文件上,一个在另一个下面,在单独的行上。 我写了下面的代码 -KD

  • 我想将一个数据帧保存到两个不同的csv文件中(拆分数据帧)-一个文件只包含标题,另一个文件包含其余行。 我想将这两个文件保存在同一个目录下,这样Spark处理所有逻辑将是最好的选择,如果可能的话,而不是使用pandas分割csv文件。 最有效的方法是什么? 谢谢你的帮助!

  • (希望有人能帮我解决这个问题)非常感谢!!