Spark原理详解

Spark优势

  • 高效性
    MapReduce将中间计算结果放入到磁盘当中,但Spark采用内存存储的方式来储存中间计算结果,IO操作大大减少,同时并行计算DAG图的优化,减少了不同任务之间的依赖,MapReduce使用进程的方式维护Task,但Spark使用线程的方式启动维护Task。
  • 易用性
    MapReduce只有Map与Reduce两种算子,Spark提供了超过80种Transformation和Action的算子,包括map、reduce、filter、groupByKey,SortByKey,foreach等,且函数式编程风格也大大减少代码量。
  • 通用性
    Spark提供了统一的解决方案。Spark可以用于批处理、交互式查询(Spark SQL)、实时流处理(Spark Streaming)、机器学习(Spark MLlib)和图计算(GraphX。
  • 兼容性
    Spark可以使用Hadoop的YARN作为资源管理调度器,并可以访问多种数据源,包括HDFS、HBse、MySQL等

Spark基本概念

  • RDD:是弹性分布式数据集(Resilient Distributed Dataset)的简称,是分布式内存的一个抽象概念,提供了一种高度受限的共享内存模型。
    DAG:是Directed Acyclic Graph(有向无环图)的简称,反映RDD之间的依赖关系。
  • Driver Program:控制程序,负责为Application构建DAG图。
  • Cluster Manager:集群资源管理中心,负责分配计算资源。
  • Worker Node:工作节点,负责完成具体计算。
  • Executor:是运行在工作节点(Worker Node)上的一个进程,负责运行Task,并为应用程序存储数据。
  • Application:用户编写的Spark应用程序,一个Application包含多个Job。
  • Job:作业,一个Job包含多个RDD及作用于相应RDD上的各种操作。
  • Stage:阶段,是作业的基本调度单位,一个作业会分为多组任务,每组任务被称为“阶段”。
  • Task:任务,运行在Executor上的工作单元,是Executor中的一个线程。
    总结:Application由多个Job组成,Job由多个Stage组成,Stage由多个Task组成。Stage是作业调度的基本单位 。

Spark运行流程

1,Application首先被Driver构建DAG图并分解成Stage。

2,然后Driver向Cluster Manager申请资源。

3,Cluster Manager向某些Work Node发送征召信号。

4,被征召的Work Node启动Executor进程响应征召,并向Driver申请任务。

5,Driver分配Task给Work Node。

6,Executor以Stage为单位执行Task,期间Driver进行监控。

7,Driver收到Executor任务完成的信号后向Cluster Manager发送注销信号。

8,Cluster Manager向Work Node发送释放资源信号。

9,Work Node对应Executor停止运行。

spark cogroup原理 论述spark的工作原理和作用_spark cogroup原理

RDD数据结构

  1. RDD也叫弹性分布式数据集,是一种不可变、可分区、可并行的集合,可以通过读取文件的数据或者将内存中的对象并行化生成RDD。
  2. RDD的操作也叫算子,分为Transformation和Action两种类型,Transformation都有lazy特性,不会立即进行实际的计算,只有出发Action操作的时候,才会根据DAG图执行。
  3. RDD的依赖关系有两种,分别是宽依赖和窄依赖,窄依赖是指父RDD与子RDD的关系是一对一或多对一。宽依赖是指父RDD与子RDD的关系是多对一或多对多。
    窄依赖:map、filter、union、join with inputs co-partitioned
    宽依赖:groupByKey、reparttition、sortByKey、join with inputs not co-partitioned
  4. Spark Stage划分
    就是从最后一个RDD往前推算,遇到窄依赖(NarrowDependency)就将其加入该Stage,当遇到宽依赖(ShuffleDependency)则断开。每个Stage里task的数量由Stage最后一个RDD中的分区数决定。如果Stage要生成Result,则该Stage里的Task都是ResultTask,否则是ShuffleMapTask.
    ShuffleMapTask的计算结果需要shuffle到下一个Stage,其本质上相当于MapReduce中的mapper。Result Task则相当于MapReduce中的reducer。因此整个计算过程会根据数据依赖关系自后向前建立,遇到宽依赖则形成新的Stage。
    Stage的调度是由DAG Scheduler完成的。由RDD的有向无环图DAG切分出了Stage的有向无环图DAG。Stage以最后执行的Stage为根进行广度优先遍历,遍历到最开始执行的Stage执行,如果提交的Stage仍有未完成的父Stage,则Stage需要等待其父Stage执行完才能执行。
  5. spark cogroup原理 论述spark的工作原理和作用_spark_02