一、一层含义:分布式数据缓存
Spark允许开发者将分布式数据集缓存到计算节点的内存中,从而进行高效的数据访问。只有需要频繁访问的数据集才有必要用cache,对于一次性数据集使用cache会适得其反。在Spark中,内存计算有两层含义:1、分布式数据缓存;2、Stage内的流水线式计算模式。
二、二层含义:Stage内的流水线式计算模式
1、什么是DAG?
DAG(Direct Acyclic Graph)无环图,图有两个基本元素:顶点和边,在Spark的DAG中,顶点是一个个RDD,边是RDD间通过dependencies属性构成的父子关系。从开发者的视角出发,DAG的构建是通过在分布式数据集上不停调用算子来完成的。
2、Stages的划分
从DAG转换的分布式任务在分布式环境中执行,需要经过4个阶段:
- 回溯DAG并划分Stage
- 在Stages中创建分布式任务
- 分布式任务的分发
- 分布式任务的执行
内存计算的第二层含义(Stage内的流水线式计算模式)在Stage内部,后面3个阶段偏向调度系统范围。一句话概括从DAG到Stages的转化过程:以Actions算子为起点,从后向前回溯DAG,以Shuffle操作为边界去划分Stage。
3、Stage中的内存计算
基于内存的计算模型是根据前人教训和后人反思设计出来,前人是Hadoop MapReduce,后人是Spark。MapReduce提供两类计算抽象:
- Map抽象:Map抽象允许开发者通过实现map接口在定义数据处理逻辑;
- Reduce抽象:用于封装数据聚合逻辑。
但MapReduce的最大问题是,所有操作的数据交换都是已磁盘为媒介,这种频繁的磁盘I/O存在执行性能问题。
内存计算和MapReduce相比,只是把数据和计算挪到内存中? NO!以切土豆的Stage0为例,每个加工环节都会产出中间食材,如果把流水线比作内存,那么每个算子计算的中间结果都会进行缓存以备下一个算子运算,这样和滥用cache如出一辙。
在Spark中,流水线计算模式是指:在同一个Stage内部,所有算子融为一个函数,Stage的输出结果由这个函数一次性作用在输入数据集产生。所以所谓内存计算,不仅仅是指数据可以缓存在内存中,更重要是让我们明白,通过计算的融合来大幅提升数据再内存中的转换效率,进而从整体上提升应用的执行性能。