SPARK如何在内存中读取数据和管理
Posted
技术标签:
【中文标题】SPARK如何在内存中读取数据和管理【英文标题】:How does SPARK read data and manage in Memory 【发布时间】:2017-07-07 00:44:40 【问题描述】:谁能帮我理解 SPARK 如何读取 hdfs 数据并在主内存中管理它?
换句话说,
如果我创建 3 个 RDD,首先从 hadoop 文件中进行 RDD 并对其进行一些转换,然后创建第二个 RDD,然后再次对第 2 个 RDD 进行一些转换并创建第 3 个 RDD,然后对第 3 个 RDD 调用一些操作。
-
数据将从 hdfs 读取多少次?
如果我们不调用缓存或显式持久化,所有三个 RDD 数据是否都会保留在内存中?即当一个动作在第三个 RDD 上执行时,第一个 RDD 数据是否保留在内存中
【问题讨论】:
RDD 是懒惰的。转换操作不读取任何 HDFS 数据 但是我正在对第三个 RDD 执行一些操作,所以在执行操作后将从 HDFS 读取数据对吗? 是的,但如果所有三个 RDD 都作用于同一个文件,则只有一次 【参考方案1】:如果所有 RDD 共享一个文件,则数据只会在 action 中读取一次,而不是在任何转换时读取。
重新生成第三个 RDD 的 DAG 将在内存中,因为如前所述,只有 RDD #3 将包含任何实际数据。
【讨论】:
感谢您的澄清。如果我可以在 RDD #3 上执行另一个操作,那么我还有一个问题,无论 Spark 是从 HDFS 还是从内存中读取数据。 一旦你读过一次数据,就没有理由再读一次了,但我们必须看到你的代码【参考方案2】:如果您不缓存 RDD3,那么 Spark 将从 HDFS 读取数据,否则它将从内存中读取。
【讨论】:
以上是关于SPARK如何在内存中读取数据和管理的主要内容,如果未能解决你的问题,请参考以下文章
在 Spark SQL 中读取 40 万行时出现内存不足错误 [重复]