3 个回答
1、RDD作为Spark最根本的数据抽象,是只读的分区记录(Partition)的集合,只能基于在稳定物理存储中的数据集上创建,或者由其他已有的RDD上执行转换操作产生一个新的RDD。转化后的RDD与已有的RDD之间产生依赖关系,构成了血统(Lineage)。凭借血统Spark保证了每一个RDD都可以被重新恢复。
2、Task在启动之初读取一个分区时,会先判断这个分区是否已经被持久化,如果没有则需要检查Checkpoint或者按照血统重新计算。所以如果一个 RDD 上要执行多次行动,可以在第一次行动中使用 persist 或 cache 方法,在内存或磁盘中持久化或缓存这个 RDD,从而在后面的行动时提升计算速度。事实上,cache 方法是使用默认的 MEMORY_ONLY 的存储级别将 RDD 持久化到内存,故缓存是一种特殊的持久化。 堆内和堆外存储内存的设计,便可以对缓存 RDD 时使用的内存做统一的规划和管理。
3、RDD的持久化由Spark的Storage模块负责,实现了RDD与物理存储的解耦。Storage模块负责管理Spark在计算过程中产生的数据,将那些在内存或磁盘、在本地或者远程存储数据的功能封装了起来。在具体实现时Driver端和Executor端的Storage模块构成了主从的架构,即Driver端BlackManager为Master,Executor端的BlockManager为Slave。Storage模块在逻辑上以Block为基本存储单位,RDD的每个Partition经过处理后唯一对应一个Block的(BlockId的格式为rdd_RDD-ID_PARTITION-ID)。Master负责整个Spark应用程序的Block的元数据信息的管理和维护。而Slave需要将Block的更新状态上报到Master,同时接收Master的命令,例如新增或删除一个RDD。
2、Task在启动之初读取一个分区时,会先判断这个分区是否已经被持久化,如果没有则需要检查Checkpoint或者按照血统重新计算。所以如果一个 RDD 上要执行多次行动,可以在第一次行动中使用 persist 或 cache 方法,在内存或磁盘中持久化或缓存这个 RDD,从而在后面的行动时提升计算速度。事实上,cache 方法是使用默认的 MEMORY_ONLY 的存储级别将 RDD 持久化到内存,故缓存是一种特殊的持久化。 堆内和堆外存储内存的设计,便可以对缓存 RDD 时使用的内存做统一的规划和管理。
3、RDD的持久化由Spark的Storage模块负责,实现了RDD与物理存储的解耦。Storage模块负责管理Spark在计算过程中产生的数据,将那些在内存或磁盘、在本地或者远程存储数据的功能封装了起来。在具体实现时Driver端和Executor端的Storage模块构成了主从的架构,即Driver端BlackManager为Master,Executor端的BlockManager为Slave。Storage模块在逻辑上以Block为基本存储单位,RDD的每个Partition经过处理后唯一对应一个Block的(BlockId的格式为rdd_RDD-ID_PARTITION-ID)。Master负责整个Spark应用程序的Block的元数据信息的管理和维护。而Slave需要将Block的更新状态上报到Master,同时接收Master的命令,例如新增或删除一个RDD。
发布于:3个月前 (01-22) IP属地:四川省
通过对数据结构的分析,可以看出存储级别从三个维度定义了RDD的Partition(也就是Block)的存储方式:
1、存储位置:磁盘/堆内内存/堆外内存,如MEMORY_AND_DISK是同时在磁盘和堆内内存上存储,实现了冗余备份。OFF_HEAP则是只在堆外内存存储,目前选择堆外内存时不能同时存储到其他位置。
2、存储形式:Block缓存到存储内存后,是否为非序列化的形式。如MEMORY_ONLY是非序列化方式存储,OFF_HEAP是序列化方式存储。
3、副本数量:大于1时需要远程冗余备份到其他节点。如DISK_ONLY_2需要远程备份1个副本。
发布于:3个月前 (01-22) IP属地:四川省
我来回答
您需要 登录 后回答此问题!