Spark:数据无法放入内存,我想避免将其写入磁盘,我可以对数据切片执行迭代以仅使用内存吗?

Posted

技术标签:

【中文标题】Spark:数据无法放入内存,我想避免将其写入磁盘,我可以对数据切片执行迭代以仅使用内存吗?【英文标题】:Spark: Data can't fit in memory and I want to avoid write it in disk, can I perform iterations with slices of the data to use only the memory? 【发布时间】:2018-06-29 16:06:43 【问题描述】:

我有不适合内存的数据。所以,我正在阅读以下链接:

https://***.com/a/32582416/9759150

https://***.com/a/29518749/9759150

之前与此相关的:https://spark.apache.org/faq.html

如果数据不适合内存,则根据读取 Spark 写入磁盘。但我想避免在磁盘上写入。所以我想知道我是否可以确定我需要迭代数据多少次才能仅在内存上处理它。我可以这样做吗?怎么样?

【问题讨论】:

您希望进行哪些类型的操作?许多任务需要遍历整个数据集。我为什么要问您是否希望避免写入磁盘? ***.com/questions/41661849/… 【参考方案1】:

这很难确定性地找到迭代数据集所需的确切时间。

从磁盘和缓存中读取数据后,Spark 会将数据集具体化并使用 tungsten 格式将其表示在内存中。

现在,内存中数据集的大小取决于数据集各列的数据类型。同样由于数据的反序列化,它会比序列化的磁盘数据占用更多的内存。

根据我的经验,将 parquet 磁盘数据装入内存通常需要 3-4 倍的内存。所以如果你在 parquet 中的 HDFS 中有 50G 的数据,可能你需要集群中大约 200G 的内存来缓存完整的数据。

您需要进行反复试验,然后才能在这里得出一个完美的数字。

【讨论】:

以上是关于Spark:数据无法放入内存,我想避免将其写入磁盘,我可以对数据切片执行迭代以仅使用内存吗?的主要内容,如果未能解决你的问题,请参考以下文章

c# - 如何将文件写入内存流,压缩其中三个内存流,然后将其放入另一个内存流?

如何让 PySpark 在内存不足之前将中间结果写入磁盘?

同时向 NSMutableArray 写入和读取数据

Spark:随机写入、随机溢出(内存)、随机溢出(磁盘)之间的区别?

BlockManager

BlockManager