简介
基于DAG的任务调度执行机制,采用内存计算的方式,用于大规模数据处理的快速、通用引擎,尤其适用于迭代计算。
Spark具有运行模式多样的特点,可以独立部署在集群中,也可以运行在Hadoop集群中,可以部署在EC2云环境中。可以访问HDFS、Cassandra、HBase、Hive等多种数据源。
Spark生态主要包括Spark Core(数据处理引擎,也为其他组件提供基础数据处理组件)、Spark SQL(交互查询)、Spark Streaming(流数据处理)、MLLib和MLBase(机器学习)和GraphX(图计算)。
资源虚拟化管理(调度)方面可以使用Mesos或Yarn组件。详细的架构体系可查阅BDAS技术栈。
基本概念
RDD:弹性分布式数据集,分布式内存的抽象,提供一种调度受限的共享内存模型,;
DAG:有向无环图,反映 RDD间的依赖关系 (执行流程);
Executor:工作结点(WorkNode)上的进程,运行Task;
Application:用户编写的Spark程序;
Task:运行在Executor上的工作单元;
Job:一个Job包含多个RDD及作用于相应RDD上的操作;
Stage:Job的基本调度单位,一个Job可分为多组Task,每组Task就是一个Stage,或是TaskSet,代表一组关系的、相互之间没有Shuffle依赖关系的任务组成的任务集。
架构
Cluster Manager,负责集群资源管理,可使用Yarn或Mesos来作为资源管理器的执行组件;
Driver,是任务控制节点,负责任务分解、生成DAG、DAG的优化、DAG中任务的分配等,是集群的管家
WorkNode,负责运行具体的作业任务,每个WorkNode可以有多个Executor(执行进程),由Executor复用多线程进行Task的处理,而且Executor中的BlockManager会对内存和磁盘进行统一管理(RDD就是通过BlockManager的管理,优先写入内存中,当内存不足时,再写入磁盘),将内存和磁盘共同作为存储设备,以减少IO。
层次关系是:每个Application包含一个Driver及多个Job,每个Job包含若干Stage,每个stage包含若干Task,task在Executor中执行。
执行过程中,Driver先生成一个SparkContext用于后续的任务分解、流程(DAG Scheduler)和计划(TaskScheduler)的制定与任务管理,然后向集群管理器申请资源,并在资源中启动Executor,Executor启动后会主动向SparkContext进行注册和任务申请,TaskScheduler会将任务及程序代码发送给Executor,然后在Executor上执行Task,Executor执行结束后,将结果返回Driver中SparkContext的TaskScheduler,然后再向上层的DAG Scheduler反馈,最后写入HDFS或数据库。
RDD
RDD是一个只读的分区记录集合,RDD的不同分区会被存储到集群的不同节点上去,从而实现在集群中不同节点上的并行计算。RDD中的数据只有在创建和转换的过程中进行调整,一旦数据进入RDD则不能再修改。
RDD在执行过程中,首先会读入数据,并进行数据分区,形成RDD,然后经过一系列转换操作(后由Driver生成DAG流程图,即RDD的血缘关系),直至最后调用一个动作,对数据进行处理,在整个过程中,直至“动作”操作之前,所有的转换过程都不会写入磁盘(除非内存不足了),这样就实现了数据流式的连续操作,减少IO操作的同时,也消除了由于序列化和反序列化带来的开销,以优化整体的执行效率。
RDD血缘关系的设计使Spark具有很好的容错性,哪里出错,重新执行上一步的操作即可。
RDD的窄依赖:一个父RDD的分区,只对应一个子RDD分区或多个父RDD分区对应一个子RDD分区;(一对一或多对一,map
/filter、union、join)
宽依赖:一个父RDD的分区对应一个子RDD的多个分区。(一对多或多对多,groupByKey、join).
Spark通过分析RDD的依赖关系生成DAG,然后再根据RDD内各分区的宽窄依赖关系来划分Stage:
对DAG进行反向解析,一量遇到宽依赖就断开(宽依赖会涉及Shuffle操作),遇到窄依赖就把当前RDD放入一个stage中,将窄依赖放入同一stage,可实现数据的流水线式作业。
Stage可分为ShuffleMapStage和ResultStage。ShuffleMapStage是过程Stage,它的输出结果会经过Shuffle过程作为后续Stage(任何类型的Stage)的输入。ShuffleMapStage的输入可能是外部读入的数据或是其它ShuffleMapStage的输出,每个Job中可能有0到多个ShuffleMapStage;ResultStage是最终的Stage,没有输出,直接产生结果或存储。ResultStage的输入可能是外部读入的数据或是其它ShuffleMapStage的输出,每个Job中至少有一个ResultStage类型的Stage。
RDD的运行过程:
1.创建RDD对象
2.SparkContext计算RDD间依赖关系,构建DAG;
3.DAG Scheduler分解DAG为多个Stage,每个Stage包含1到多个Task,每个Task被TaskScheduler分发给各个WN上的Executor执行。
Spark SQL
Shark(Hive on spark)可以看作是Spark SQL的前身,在Shark中只是对Hive底层的MR计算框架替换为了Spark计算框架。但这样也就遗留了一些问题,如优化策略依赖于hive,无法添加新的优化策略,以及spark是线程级并行,在兼容Hive时,面临线程安全的问题(Hive所依赖的MR是进程级并行)等;Spark SQL延用了Hive的解析器和元数据管理,执行计划和优化由Catalyst完成,其余部分也都根据Spark框架重写。
Spark SQL中增加了SchemaRDD,使Spark SQL的数据源可以是来源于RDD,也可以是Hive、HDFS、Cassandra或Json格式的外部数据,支持的数据类型更多。支持Scala、java、python开发。
支持Standalone、Mesos和Yarn三种部署方式。
SparkStreaming无法做到毫秒级的响应而是秒级的响应,本质上它还是属于小数据集的处理。毫秒级的响应仍然需要使用Storm。