开源组件系列(12):DAG计算引擎Spark

目录

(一)概述

(二)Spark核心概念

(三)Spark程序基本框架

(四)Spark编程接口

(五)Spark运行模式

(六)Spark应用示例

(七)Spark作业生命周期

(八)Spark Shuffle


(一)概述

 

Spark是在MapReduce的基础上产生的,借鉴了大量MapReduce实践经验,并引入多种新型设计思想和优化策略。我们首先看一下MapReduce的局限和Spark在此基础上做出的改进。

 

MapReduce的缺陷:

1.仅支持Map和Reduce两种操作:由于MapReduce提供的编程结果比较低层次,因而实现一些常用的功能,如排序、分组等,需要编写大量的代码。

2.处理效率低:每次启动MapReduce均需要消耗大量资源,对于复杂的Hive Sql,需要拆解成多个MapReduce作业。

3.不适合迭代式和交互式计算:MapReduce是一种基于磁盘的分布式计算框架,追求的是高吞吐率而非高性能,因此在迭代式(机器学习)和交互式(点击日志分析)等场景下表现并不好。

 

Spark的特点:

1.高性能:Spark采用内存计算引擎,允许用户将数据放到内存中以加快数据读取;同时,Spark提供了更加通用的DAG计算引擎,使得数据可通过本地磁盘或内存流向不同的计算单元。

2.简单易用:Spark提供了丰富的高层次API,包括sortByKey、groupByKey等操作,并且提供了四种编程语言API:Scala、Python、Java和R,从代码量看,Spark比MapReduce少2~5倍。

3.与Hadoop完好集成:Spark作为新型框架,可以部署在YARN集群桑,读取和存储HDFS/HBase中的数据。

 

(二)Spark核心概念

 

1.RDD

Spark提出了一个数据集抽象概念RDD,即弹性分布式数据集,它是一个只读的、带分区的数据集合,并支持多种分布式算子。RDD是Spark计算引擎的核心,具有以下几个特点:

(1)分布在集群中的只读对象集合,由多个Partition构成,这些Partition可能存储在不同机器上。

(2)RDD可以存储在磁盘或内存中,Partition可全部存储在内存或磁盘上,也可以部分在内存中,部分在磁盘上。

(3)通过并行“转换”操作构造:Spark提供了大量API听过并行的方式构造和生成RDD。

(4)失效后自动重构:RDD可通过一定计算方式转换成另外一种RDD,这种通过转换而产生的RDD关系称为“血统”。Spark通过记录RDD的血统,可了解每个RDD的产生方式,进而能够通过重算的方式构造因机器故障或磁盘损坏而丢失的RDD数据。

RDD只是一个逻辑概念,它可能并不对应磁盘或内存中的物理数据,而仅仅是记录了RDD的由来,RDD由五个部分组成:一组partition、每个partition的计算函数、所依赖的RDD列表、对于key-value类型的RDD包含一个partitioner(默认是hash)、计算每个partition所倾向的节点位置。

作用在RDD上的操作主要分为两类:transformation和action:transformation是转换的意思,主要作用为将一种RDD转换为另一类RDD。action是行动的意思,通过处理RDD得到一个或一组结果。

 

2.DAG

Spark是一个通用的DAG引擎,这使得用户能够在一个应用程序中描述复杂的逻辑,以便于优化整个数据流,并让不同计算阶段直接通过本地磁盘或内存交换数据,而不是像MapReduce那样需要通过HDFS。以下面的SQL语句为例:

下面左图是MapReduce生成的DAG数据流,右图是Spark生成的DAG数据流。

可以看出,Spark的实现要简洁的多,内部不同计算单元通过本地磁盘或内存交换数据,使得磁盘和网络IO的消耗更小,性能更加高效。

 

(三)Spark程序基本框架

 

每个Spark应用程序的运行环境是由一个Driver进程和多个Executor进程构成的,它们运行在不同机器上,并通过网络相互通信。Driver进程运行用户程序,并依次经历逻辑计划生成、物理计划生成、任务调度等阶段后,将任务分配到各个Executor上执行。Executor进程拥有独立计算资源的JVM实例,其内部以线程方式运行Driver分配的任务。下图展示了一个Spark应用程序的运行环境,由1个Driver和3个Executor构成,每个Executor内部可同时运行4个任务。

 

(四)Spark编程接口

 

Spark程序设计流程一般如下:

1.实例化SparkContext对象:SparkContext封装了程序运行的Context,包括配置信息、数据块管理、任务调度器等;

2.构造RDD:可通过SparkContext提供的函数构造RDD,常见的RDD构造方式分为两种:将Scala集合转换为RDD和将Hadoop文件转换为RDD;

 

3.在RDD的基础上,通过Spark提供的transformation算子完成数据处理逻辑;

4.通过action算子将最终RDD作为结果直接返回或者保存到文件中。

 

(五)Spark运行模式

 

Spark支持的运行模型包括:

1.Local:本地模式,将Driver与Executor均运行在本地。

2.Standalone:由一个master和多个slave服务组成的Spark独立集群运行环境,Spark应用程序的Driver与Executor运行在该集群环境中。

3.YARN:将Hadoop YARN作为资源管理和调度系统,让Spark程序运行在YARN之上。根据Driver是否由YARN管理,可以进一步分为yarn-client和yarn-cluster两种模式。

4.Mesos:将Apache Mesos作为资源管理和调度系统,用户可通过设置master url的方式,指定Spark应用程序的运行模式。

 

(六)Spark应用示例

 

以倒排索引为例:

 

(七)Spark作业生命周期

 

Spark应用程序从提交到运行,依次会经历以下几个阶段:

1.生成逻辑计划:通过应用程序内部RDD之间的依赖关系,构造DAG,其中DAG中每个点事一个RDD对象,边则是两个RDD之间的转换方式。简而言之,该阶段主要作用是将用户程序直接翻译成DAG。

2.生成物理计划:根据前一阶段生成的DAG,按照一定的规则进一步将之划分为若干Stage,每个Stage由若干个可并行计算的任务构成。

3.调度并执行任务:按照依赖关系,调度并计算每个Stage,对于给定的Stage,将其对应的任务调度给多个Executor同时计算。

 

(八)Spark Shuffle

 

Shuffle阶段是Spark应用程序最关键的计算和数据交换环节,Spark中很多算子会产生Shuffle阶段,包括:*ByKey(groupByKey、reduceByKey、sortByKey等)、join、cogroup、cartesian和repartition等,下面代码片段给出了reduceByKey算子的使用方式哦、

下图给出了上述代码的逻辑计划图,其中reduceByKey算子会产生一个Shuffle阶段,其输入RDD为kvRdd,输出RDD为resultRdd,两者之间生成了两个临时的RDD,并通过网络进行数据交换。本质上,这是一个两阶段的执行过程,与MapReduce基本一致:第一类任务并行从输入目录中读取与处理数据,之后启动另一类任务读取前一类任务的输出结果,并进行规约,将最终结果写到输出目录中。

 

原创文章 54 获赞 61 访问量 1万+

猜你喜欢

转载自blog.csdn.net/gaixiaoyang123/article/details/105417825
今日推荐