Spark简介及运行架构

Spark学习网站

建议从学习Spark官方文档开始:
Quick Start - Spark 2.1.1 Documentation
Spark Programming Guide
这里有对应的中译版:
Spark官方文档-快速入门
Spark官方文档-Spark编程指南
spark中文文档

参考链接:http://dblab.xmu.edu.cn/blog/972-2/

基础概念

重要概念:

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

架构设计

如图9-5,Spark运行架构包括集群自愿管理器(Cluster manager),运行作业任务的工作节点(Worker Node)、每个应用发的任务控制节点(Deiver)和每个工作节点上负责具体任务的执行进行(Exector) 。中,集群资源管理器可以是Spark自带的资源管理器,也可以是YARN或Mesos等资源管理框架。

Spark优点(相比于Hadoop MapReduce):

  • 1.利用多线程来执行具体的任务,减少任务的启动开销;
  • 2.Exector中有一个BlockManager存储模块,会将内存和磁盘共同作为存储设备;当需要多轮迭代计算时,可以将其中结果存储到这个存储模块里,下次需要就可以直接读取该存储模块里的数据,而不是读写到HDFS等文件系统中。减少IO开销
    Spark简介及运行架构_第1张图片

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

Spark简介及运行架构_第2张图片

Spark运行基本流程

如图9-7,Spark基本运行流程如下:

  • (1)当一个Spark应用被提交时,受限需要为这个应用构建起基本的运行环境,即由运行任务控制节点(Driver)创建一个SparkContext,由SparkContext负责和资源管理器的通信以及进行资源的申请,任务的分配和监控等。SparkContex会向资源管理器注册并申请运行Exector的资源;
  • (2)资源管理器为Exector分配资源,并启动Exector进行,Exector运行情况会将随着“心跳”发送到资源管理器上;
  • SparkContext根据RDD的依赖关系构建DAG图,DAG图提交给DAG跳动器进行解析,将DAG图分解成多个阶段(每个阶段都是一个任务集),并且计算出各个阶段之间的依赖关系,然后把一个个任务集都提交给任务调度器进行处理;Exector向SparkContext申请任务,任务调度器见过任务分发给Exector运行,同时SparkContext将应用程序代码分发给Exector;
  • 任务在Exector上运行,把执行结果反馈给任务调度器,然后反馈给DAG调度器,运行完毕后写入数据并释放所有资源。
    图9-7 Spark运行基本流程图

总结:spark特点

  • (1) 每个应用都有自己的专属Exector,并且该进行再应用运行期间一直主流。Executor进程以多线程的方式运行任务,减少了多进程任务频繁的启动开销,使得任务执行变得非常高效和可靠;
  • (2) Spark运行过程与资源管理器无关,只要能够获取Executor进程并保持通信即可
  • (3) Executor上有一个BlockManager存储模块,类似于键值存储系统(把内存和磁盘共同作为存储设备),在处理迭代计算任务时,不需要把中间结果写入到HDFS等文件系统,而是直接放在这个存储系统上,后续有需要时就可以直接读取;在交互式查询场景下,也可以把表提前缓存到这个存储系统上,提高读写IO性能;
  • (4) 任务采用了数据本地性和推测执行等优化机制。数据本地性是尽量将计算移到数据所在的节点上进行,即“计算向数据靠拢”,因为移动计算比移动数据所占的网络资源要少得多。而且,Spark采用了延时调度机制,可以在更大的程度上实现执行过程优化。比如,拥有数据的节点当前正被其他的任务占用,那么,在这种情况下是否需要将数据移动到其他的空闲节点呢?答案是不一定。因为,如果经过预测发现当前节点结束当前任务的时间要比移动数据的时间还要少,那么,调度就会等待,直到当前节点可用。

你可能感兴趣的:(BigData,大数据,spark,hadoop,scala)