Spark 的介绍与搭建:从理论到实践_spark环境搭建-CSDN博客
Spark 的Standalone集群环境安装与测试-CSDN博客
Spark 程序开发与提交:本地与集群模式全解析-CSDN博客
Spark on YARN:Spark集群模式之Yarn模式的原理、搭建与实践-CSDN博客
Spark 中 RDD 的诞生:原理、操作与分区规则-CSDN博客
Spark 中的 RDD 分区的设定规则与高阶函数、Lambda 表达式详解-CSDN博客
PySpark 数据处理实战:从基础操作到案例分析-CSDN博客
目录
四、RDD 的 cache、persist 持久化机制和 checkpoint 检查点机制的区别
在大数据处理领域,Spark 作为一款强大的分布式计算框架,面临着数据丢失和性能优化的双重挑战。为了确保数据的安全性和处理效率,Spark 构建了一套完善的容错机制。本文将深入探讨 Spark 的容错机制,包括 RDD 的持久化机制(persist 和 cache 算子)以及检查点机制(checkpoint),并分析它们的特点、适用场景以及相互之间的区别。
一、Spark 容错机制概述
1、各个软件为了防止数据丢失的解决方案
操作日志:
将内存变化操作日志追加记录在一个文件中,下一次读取文件对内存重新操作
- NAMENODE:元数据的操作日志记录在edits
- MySQL:日志记录binlog ()
副本机制:将数据构建多份冗余副本
- HDFS:构建每个数据块的3个副本
依赖关系:每份数据保留与其他数据之间的一个转换关系
- RDD:保留RDD与其他RDD之间的依赖关系
2、Spark如何保障数据的安全
每个RDD在构建数据时,会根据自己来源一步步导到数据来源,然后再一步步开始构建RDD数据。
问题:如果一个RDD被触发多次,这个RDD就会按照依赖关系被构建多次,性能相对较差,怎么解决?
例如:日志分析的时候,三个问题,tupleRdd 之前的所有操作都要执行三次,每次读取100M多的数据,效率非常的低
- 第一次:一定会通过血脉构建这个RDD的数据
- 希望从第二次开始,就不要重复构建,直接使用第一个构建的内容
- 实现:Spark持久化机制:主动将RDD进行保存,供多次使用,避免重复构建
二、RDD 持久化机制
(一)cache 算子
- 功能:将 RDD 缓存在内存中,以便后续多次使用时无需重新计算。
- 语法:
cache()。 - 本质:底层实际调用的是
persist(StorageLevel.MEMORY_ONLY),即只尝试将 RDD 缓存在内存。但如果内存资源不足,缓存操作可能会失败。 - 场景:适用于资源充足且确定 RDD 只需在内存中缓存的情况,例如对于一些频繁使用且数据量较小能够完全容纳在内存中的 RDD,可以使用 cache 算子提高数据读取速度。
(二)persist 算子
- 功能:能够将 RDD(包含其依赖关系)进行缓存,并且可以根据需求自行指定缓存的级别,这是它与 cache 算子的主要区别。
- 语法:
persist(StorageLevel)。 - 级别:
- 将 RDD 缓存在磁盘中:
StorageLevel.DISK_ONLY = StorageLevel(True, False, False, False):将庞大且暂时不急需使用的 RDD 放入磁盘,释放 Executor 内存。StorageLevel.DISK_ONLY_2 = StorageLevel(True, False, False, False, 2):在磁盘中多存储一个缓存副本,提高数据的冗余性和可用性。StorageLevel.DISK_ONLY_3 = StorageLevel(True, False, False, False, 3):类似地,存储三个副本。StorageLevel.DISK_ONLY = StorageLevel(True, False, False, False) StorageLevel.DISK_ONLY_2 = StorageLevel(True, False, False, False, 2) StorageLevel.DISK_ONLY_3 = StorageLevel(True, False, False, False, 3)
- 将 RDD 缓存在内存中:
StorageLevel.MEMORY_ONLY = StorageLevel(False, True, False, False):仅使用内存进行缓存,常用于高频使用且数据量不大能适应内存容量的 RDD。StorageLevel.MEMORY_ONLY_2 = StorageLevel(False, True, False, False, 2):增加一个内存缓存副本。StorageLevel.MEMORY_ONLY = StorageLevel(False, True, False, False) StorageLevel.MEMORY_ONLY_2 = StorageLevel(False, True, False, False, 2)
- 将 RDD 优先缓存在内存中,如果内存不足,就缓存在磁盘中:
StorageLevel.MEMORY_AND_DISK = StorageLevel(True, True, False, False):对于高频使用的大 RDD 较为合适,先利用内存缓存,当内存空间不足时,自动将多余数据溢出到磁盘。StorageLevel.MEMORY_AND_DISK_2 = StorageLevel(True, True, False, False, 2):多一个缓存副本。StorageLevel.MEMORY_AND_DISK = StorageLevel(True, True, False, False) Sto
- 将 RDD 缓存在磁盘中:


53

被折叠的 条评论
为什么被折叠?



