数据岗位面试题更新 2026-08-05

在 Apache Spark 中,使用 cache() 与 persist() 方法对性能优化有何作用?请阐述它们的主要区别,并说明在实际应用中应如何选择持久化级别。

数据性能优化技术原理方案权衡Apache Spark

考察说明

考查对 Spark RDD/DataFrame 缓存机制的理解,包括缓存操作的作用和持久化级别的合理选择。

回答思路

  1. 【回答框架 1】cache() 是 persist() 的特例,默认使用 MEMORY_ONLY 级别,将数据以反序列化形式存储在堆内存中。persist() 允许指定 StorageLevel,如 MEMORY_AND_DISK、MEMORY_ONLY_SER 等,以平衡内存占用和计算开销。
  2. 【回答框架 2】缓存的核心作用是避免重复计算同一 RDD,尤其当该 RDD 被多个 Action 使用或在迭代计算中复用。通过缓存,Spark 在后续计算中直接读取缓存数据,减少重新计算的开销,从而提升性能。
  3. 【回答框架 3】选择持久化级别时,需考虑数据大小、内存资源、序列化代价和磁盘 I/O。若数据能完全放入内存,优先使用 MEMORY_ONLY;若内存不足,使用 MEMORY_AND_DISK 避免 OOM;若数据量大且需节省内存,可使用 MEMORY_ONLY_SER(序列化存储)以降低内存占用,但会增加序列化和反序列化开销。
  4. 【回答框架 4】还需注意,当需要更高的容错性(如节点故障后快速恢复)时,可考虑带副本的级别,如 MEMORY_AND_DISK_2。缓存后的数据在节点故障时可通过副本快速恢复,但会增加存储成本和网络传输开销。
  5. 【回答框架 5】实际应用中,应根据具体场景选择:若数据被多次复用(如迭代算法),建议缓存;若只使用一次,则无需缓存,因为缓存本身也有管理开销。同时,应监控内存使用,必要时使用 Spark UI 查看缓存情况,并调整执行内存和存储内存的比例。
  6. 【关键点 1】cache() 默认使用 MEMORY_ONLY 级别,是 persist() 的特殊形式。
  7. 【关键点 2】persist() 允许指定多种 StorageLevel,如 MEMORY_ONLY、MEMORY_AND_DISK、MEMORY_ONLY_SER 等。
  8. 【关键点 3】缓存能避免重复计算,显著提升迭代或多 Action 场景的性能。
  9. 【关键点 4】选择持久化级别需平衡内存占用、序列化开销和磁盘 I/O。
  10. 【关键点 5】数据只使用一次时无需缓存,避免额外开销。
  11. 【易错点 1】容易误以为 cache() 会自动采用内存和磁盘备份,实际默认仅内存,可能因内存不足导致数据丢失(如果未设置 MEMORY_AND_DISK)。
  12. 【易错点 2】不应盲目缓存所有数据,过度缓存会占用大量内存,可能导致执行内存不足而频繁 GC,反而降低性能。
  13. 【易错点 3】误认为缓存后数据一定不会丢失,但 MEMORY_ONLY 在内存不足时可能丢弃分区,需重新计算。