gpt4 book ai didi

apache-spark - 为什么我必须明确告诉 Spark 缓存什么?

转载 作者:行者123 更新时间:2023-12-04 16:38:59 26 4
gpt4 key购买 nike

在 Spark 中,每次我们对 RDD 执行任何操作时,都会重新计算 RDD。所以如果我们知道 RDD 将被重用,我们应该显式缓存 RDD。

假设,Spark 决定懒惰地缓存所有 RDD,并使用 LRU 自动将最相关的 RDD 保留在内存中(这就是大多数缓存的工作方式)。这对开发人员有很大帮助,因为他不必考虑缓存并专注于应用程序。此外,我不知道它如何对性能产生负面影响,因为很难跟踪程序内部使用变量 (RDD) 的次数,大多数程序员会决定以任何方式缓存大部分 RDD。

缓存通常会自动发生。以操作系统/平台或框架或工具为例。但是由于分布式计算中缓存的复杂性,我可能会忽略为什么缓存不能是自动的或性能影响。

所以我不明白,为什么我必须明确缓存为,

  • 难看
  • 很容易错过
  • 它很容易被过度使用/使用不足
  • 最佳答案

    主观原因 list :

  • 在实践中,缓存很少需要,主要用于迭代算法,打破长的血统。例如,典型的 ETL 管道可能根本不需要缓存。缓存大部分 RDD 绝对不是正确的选择。
  • 没有通用的缓存策略。实际选择取决于可用资源,如内存量、磁盘(本地、远程、存储服务)、文件系统(内存中、磁盘上)和特定应用程序。
  • 磁盘上的持久性很昂贵,内存中的持久性会给 JVM 带来更多压力,并且正在使用 Spark 中最有值(value)的资源
  • 如果不对应用程序语义做出假设,就不可能自动缓存。特别是:
  • 数据源更改时的预期行为。没有统一的答案,在许多情况下无法自动跟踪更改
  • 区分确定性和非确定性转换并在缓存和重新计算之间进行选择
  • 将 Spark 缓存与操作系统级缓存进行比较是没有意义的。操作系统缓存的主要目标是减少延迟。在 Spark 中,延迟通常不是最重要的因素,缓存用于其他目的,例如一致性、正确性和减少系统不同部分的压力。
  • 如果缓存不使用堆外存储,那么缓存会给垃圾收集器带来额外的压力。 GC 成本实际上可能高于重新计算数据的成本。
  • 根据数据和缓存方法,从缓存中读取数据在内存方面的效率可能会显着降低。
  • 缓存会干扰 Spark SQL 中可用的更高级优化,有效地禁用分区修剪或谓词和投影下推。

  • 还值得注意的是:
  • 使用 LRU
  • 自动处理删除缓存数据
  • 一些数据(如中间 shuffle 数据)会自动持久化。我承认它使之前的一些论点至少部分无效。
  • Spark 缓存不影响系统级或 JVM 级机制
  • 关于apache-spark - 为什么我必须明确告诉 Spark 缓存什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34117469/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com