Spark是基于内存计算的大数据并行计算框架,可用于构建大型的、低延迟的数据分析应用程序。

Spark特点

  • 运行速度快:Spark使用先进的DAG(Directed Acyclic Graph,有向无环图)执行引擎,以支持循环数据流与内存计算,基于内存的执行速度可比Hadoop MapReduce快上百倍,基于磁盘的执行速度也能快10倍。
  • 容易使用:Spark支持使用Scala、Java、Python和R语言进行编程,简洁的API设计有助于用户轻松构建并行程序,并且可以通过Spark Shell进行交互式编程
  • 通用性:Spark提供了完整而强大的技术栈,包括SQL查询、流式计算、机器学习和图算法组件。这些组件可以无缝整合在一个应用中,足以面对复杂的计算。
  • 运行模式多样:Standalone,Spark on Mesos,Spark on Yarn

Spark相对于Hadoop的优势
Hadoop已经成为大数据技术的事实标准,但是它仍然有很多缺陷,如:MapReduce计算模型延迟过高,无法胜任实时、快速计算的需求,因此只适用于离线批处理的应用场景。
Hadoop的缺点:

  • 表达能力有限,计算都必须转成Map和Reduce两个操作,着并不适合所有的情况,难以描述复杂的数据处理过程。
  • 磁盘IO开销大,每次执行时都需要从磁盘读取数据,并且在计算完成后需要将中间结果写入到磁盘中,IO开销过大
  • 延迟高,一次计算可能需要分解成一系列按照循序执行的MapReduce任务,任务之间的衔接涉及IO开销,会产生较高的延迟

Spark的优点:

  • Spark的计算模式也属于MapReduce,但是不局限于Map和Reduce操作,还提供了多种数据集操作类型,编程模型比MapReduce更加灵活
  • Spark提供了内存计算,中间结果直接放到内存中,带来了更高的迭代运算效率
  • Spark基于DAG的任务调度执行机制,要优于MapReduce的迭代执行机制

Spark最大的特点是将计算数据、中间数据都保存在内存中,大大减少了IO开销。Spark不能替代Hadoop,主要用于替代Hadoop中的MapReduce计算模型。它可以借助Yarn实现资源调度管理,借助HDFS实现分布式存储。

Spark基本概念

  • RDD:弹性分布式数据集,是分布式内存的一个抽象概念,提供了一种高度共享的内存模型
  • DAG:Directed Acyclic Graph(有向无环图),反应了RDD之间的依赖关系
  • Executor:是运行在工作节点(Worker Node)上的一个进程,负责运行任务,并为应用程序存储数据
  • Application:用户编写的Spark应用程序
  • Task:运行在Executor上的工作单元
  • job:一个作业包含多个RDD及作用在RDD上的各自操作
  • stage:是作业的基本调度单位,一个作业会分为多组任务,每组任务被称为“阶段”,或者被称为任务集

Spark结构设计

Spark运行架构包括集群资源管理器(Cluster Manager)、运行作业任务的工作节点(Worker Node)、每个工作节点上负责具体任务的执行进程(Executor)。集群资源管理器可以是Spark自带的资源管理器,也可以是Yarn等资源管理框架。

Spark 基础教程
Spark各自概念之间的关系

在Spark中,一个应用(Application)由一个任务控制节点(Driver)和若干个作业(Job)组成。一个作业由多个阶段(Stage)构成,一个阶段由多个任务(Task)组成。当执行一个应用时,任务控制节点会向集群管理器(Cluster Manager)申请资源,启动Executor,并向Executor发送应用程序代码和文件,然后再Executor上执行任务,运行任务结束后,执行结果会返回给任务控制节点,或者写到HDFS或者其他数据库中。

Executor的优点

  1. 利用多线程来执行具体的任务(Hadoop MapReduce采用的是进程模型),减少任务的启动开销
  2. Executor中有一个BlockManager存储模块,会将内存和磁盘共同作为存储设备,当需要多代迭代计算时,可以将中间结果存储到这个存储模块里,以便下次直接读存储模块里的数据,而不需要读写到HDFS文件系统里,因而有效减少了IO开销;或者在交互式查询场景下,预先将表缓存到该存储系统上,从而提高读写IO性能。

Spark运行基本流程

  1. 当一个Spark应用程序被提交时,首先需要这个应用构建基本的运行环境,即由任务控制节点(Driver)创建一个SparkContext,由SparkContext负责与资源管理器(Cluster Manager)进行通信,以及资源的申请,任务的分配和监控等
  2. 资源管理器为Executor分配资源,并启动Executor进程,Executor运行情况将随着心跳发送给资源管理器上
  3. SparkContext根据RDD的依赖关系构建DAG图,DAG图提交给DAG调度器(DAGScheduler)进行解析,将DAG图分解为多个"阶段"(每个阶段)

相关文章: