一、一层含义:分布式数据缓存

        Spark允许开发者将分布式数据集缓存到计算节点的内存中,从而进行高效的数据访问。只有需要频繁访问的数据集才有必要用cache,对于一次性数据集使用cache会适得其反。在Spark中,内存计算有两层含义:1、分布式数据缓存;2、Stage内的流水线式计算模式。

二、二层含义:Stage内的流水线式计算模式

1、什么是DAG?

      DAG(Direct Acyclic Graph)无环图,图有两个基本元素:顶点和边,在Spark的DAG中,顶点是一个个RDD,边是RDD间通过dependencies属性构成的父子关系。从开发者的视角出发,DAG的构建是通过在分布式数据集上不停调用算子来完成的。

spark几种shuffle spark的dag_spark

2、Stages的划分

    从DAG转换的分布式任务在分布式环境中执行,需要经过4个阶段:

  • 回溯DAG并划分Stage
  • 在Stages中创建分布式任务
  • 分布式任务的分发
  • 分布式任务的执行

     内存计算的第二层含义(Stage内的流水线式计算模式)在Stage内部,后面3个阶段偏向调度系统范围。一句话概括从DAG到Stages的转化过程:以Actions算子为起点,从后向前回溯DAG,以Shuffle操作为边界去划分Stage

spark几种shuffle spark的dag_spark

3、Stage中的内存计算

       基于内存的计算模型是根据前人教训和后人反思设计出来,前人是Hadoop MapReduce,后人是Spark。MapReduce提供两类计算抽象:

  • Map抽象:Map抽象允许开发者通过实现map接口在定义数据处理逻辑;
  • Reduce抽象:用于封装数据聚合逻辑。

    但MapReduce的最大问题是,所有操作的数据交换都是已磁盘为媒介,这种频繁的磁盘I/O存在执行性能问题。

spark几种shuffle spark的dag_大数据_03

 

      内存计算和MapReduce相比,只是把数据和计算挪到内存中? NO!以切土豆的Stage0为例,每个加工环节都会产出中间食材,如果把流水线比作内存,那么每个算子计算的中间结果都会进行缓存以备下一个算子运算,这样和滥用cache如出一辙。

spark几种shuffle spark的dag_数据集_04

       在Spark中,流水线计算模式是指:在同一个Stage内部,所有算子融为一个函数,Stage的输出结果由这个函数一次性作用在输入数据集产生。所以所谓内存计算,不仅仅是指数据可以缓存在内存中,更重要是让我们明白,通过计算的融合来大幅提升数据再内存中的转换效率,进而从整体上提升应用的执行性能。

spark几种shuffle spark的dag_学习_05