【问题标题】:Apache Spark - Iterators and Memory consumptionApache Spark - 迭代器和内存消耗
【发布时间】:2020-06-07 16:23:08
【问题描述】:

我是 spark 的新手,对迭代器的 spark 内存使用有疑问。

当使用 Datasets 的 Foreach() 或 MapPartitions() 时(甚至直接调用 RDD 的 iterator() 函数),spark 是否需要先将整个分区加载到 RAM(假设分区在磁盘中)还是可以数据在我们继续迭代的过程中进行惰性加载(意味着 spark 只能加载部分分区数据执行任务并将中间结果保存到磁盘)

【问题讨论】:

    标签: apache-spark


    【解决方案1】:

    这两者的第一个区别是forEach() 是一个动作,而mapPartition() 是一个转换。将forEach 与forEachPartition 进行比较会更有意义,因为它们都是动作,并且它们都对驱动程序的最终累积数据起作用。有关这两者的详细讨论,请参阅 here。至于内存消耗,它实际上取决于您返回给驱动程序的数据量。作为经验法则,请记住使用limit(), take(), first() 等方法在驱动程序上返回结果,并避免使用collect(),除非您确定数据可以放入驱动程序的内存中。

    mapPartition 可以与map 或flatMap 函数进行比较,它们将通过应用一些转换来修改数据集的数据。 mapPartition 效率更高,因为当 map 对数据集中的每个项目执行相同操作时,它将执行给定 func 的次数更少。有关这两个功能的更多详细信息,请参阅here。

    【讨论】:

      猜你喜欢
      • 2014-05-09
      • 2012-12-28
      • 2015-10-18
      • 1970-01-01
      • 2016-06-29
      • 2015-11-30
      • 2014-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多