×

Spark简介以及架构

96
Bloo_m
2016.11.24 23:21* 字数 3163

Spark是什么?
Spark是基于内存计算的大数据并行计算框架.Spark基于内存计算,提高了在大数据环境下数据处理的实时性,同时保证了高容错性和高可伸缩性,允许用户将Spark部署在大量的廉价硬件之上,形成集群
Spark诞生于加州大学伯利克分校AMPLab
AMPLab开发以Spark为核心的BDAS时提出的目标是:one stack to rule them all,也就是说在一套软件栈内完成各种大数据分析任务.

Spark是MapReduce的替代方案,而且兼容HDFS、Hive等分布式存储层,可融入
Hadoop的生态系统,以弥补缺失MapReduce的不足
Spark相比Hadoop MapReduce的优势如下:
(1)中间结果输出
基于MapReduce的计算引擎通常会将中间结果输出到磁盘上,进行存储和容错。出于
任务管道承接的考虑,当一些查询翻译到MapReduce任务时,往往会产生多个Stage,而
这些串联的Stage又依赖于底层文件系统(如HDFS)来存储每一个Stage的输出结果。
Spark将执行模型抽象为通用的有向无环图执行计划(DAG),这可以将多Stage的任
务串联或者并行执行,而无须将Stage中间结果输出到HDFS中。类似的引擎包括Dr yad、
Tez。
(2)数据格式和内存布局
Spark抽象出分布式内存存储结构弹性分布式数据集RDD,进行数据的存储。RDD能支持粗粒度写操作,但对于读取操作,RDD可以精确到每条记录,这使得RDD可以用来作为分布式索引
Spark的特性是能够控制数据在不同节点上的分区,用户可以自定义分区策略,如Hash分区等.Shark和Spark SQL在Spark的基础上实现了列存储和列存储压缩
(3)执行策略
Spark任务在shuffle中不是所有情景都需要排序,所以支持基于Hash的分布式聚合,调度中采用更为通用的任务执行计划图(DAG),每一轮次的输出结果在内存缓存
(4)任务调度的开销
传统的MapReduce系统,是为了运行长达数小时的批量作业而设计的,在某些极端的情况下,提交一个任务的延迟非常高
Spark采用了事件驱动的类库AKKA来启动任务,通过线程池复用线程来避免进程或线程启动和切换开销

Spark生态系统BDAS(Berkeley Data Analytics Stack)
目前,Spark已经发展成为包含众多子项目的大数据计算平台。伯克利将Spark的整个
生态系统称为伯克利数据分析栈(BDAS)。其核心框架是Spark,同时BDAS涵盖支持结
构化数据SQL查询与分析的查询引擎Spark SQL和Shark,提供机器学习功能的系统
MLbase及底层的分布式机器学习库MLlib、并行图计算框架GraphX、流计算框架Spark
Streaming、采样近似计算查询引擎BlinkDB、内存分布式文件系统Tachyon、资源管理框
架Mesos等子项目。这些子项目在Spark上层提供了更高层、更丰富的计算范式。
图1-1为BDAS的项目结构图。

Paste_Image.png

图1-1 伯克利数据分析栈(BDAS)项目结构图
下面对BDAS的各个子项目进行更详细的介绍。
(1)Spark
Spark是整个BDAS的核心组件,是一个大数据分布式编程框架,不仅实现了MapReduce的算子map函数和reduce函数及计算模型,还提供更为丰富的算子,如filter、join、groupByKey等.其底层采用Scala这种函数式语言书写而成,并且所提供的API深度借鉴Scala函数式的编程思想,提供与Scala类似的编程接口。
图1-2为Spark的处理流程(主要对象为RDD)。

Paste_Image.png

Spark将数据在分布式环境下分区,然后将作业转化为有向无环图(DAG),并分阶段进行DAG的调度和任务的分布式并行处理。

(2)Shark
Shark是构建在Spark和Hive基础之上的数据仓库。Shark底层复用Hive的解析器、优化
器以及元数据存储和序列化接口。Shark会将Hive QL编译转化为一组Spark任务,进行分布式运算。

(3)Spark SQL
Spark SQL提供在大数据上的SQL查询功能,类似于Shark在整个生态系统的角色,它们可以统称为SQL on Spark。Spark SQL使用Catalyst做查询解析和优化器,并在底层使用Spark作为执行引擎实现SQL的Operator

(4)Spark Streaming
Spark Streaming通过将流数据按指定时间片累积为RDD,然后将每个RDD进行批处理,进而实现大规模的流数据处理。其吞吐量能够超越现有主流流处理框架Storm,并提供丰富的API用于流数据计算。

(5)GraphX
GraphX基于BSP模型,在Spark之上封装类似Pregel的接口,进行大规模同步全局的图计算,尤其是当用户进行多轮迭代时,基于Spark内存计算的优势尤为明显

(6)Tachyon
Tachyon是一个分布式内存文件系统,可以理解为内存中的HDFS。为了提供更高的性能,将数据存储剥离Java Heap

(7)Mesos
Mesos是一个资源管理框架,提供类似于YARN的功能。用户可以在其中插件式地运行Spark、MapReduce、Tez等计算框架的任务。Mesos会对资源和任务进行隔离,并实现高效的资源任务调度。

(8)BlinkDB
BlinkDB是一个用于在海量数据上进行交互式SQL的近似查询引擎。它允许用户通过在查询准确性和查询响应时间之间做出权衡,完成近似查询。其数据的精度被控制在允许的误差范围内。为了达到这个目标,BlinkDB的核心思想是:通过一个自适应优化框架,随着时间的推移,从原始数据建立并维护一组多维样本;通过一个动态样本选择策略,选择一个适当大小的示例,然后基于查询的准确性和响应时间满足用户查询需求。

Spark架构
Spark是整个BDAS的核心。生态系统中的各个组件通过Spark来实现对分布式并行任务处理的程序支持
Spark架构采用了分布式计算中的Master-Slave模型。Master是对应集群中的含有Master进程的节点,Slave是集群中含有Worker进程的节点。Master作为整个集群的控制器,负责整个集群的正常运行;Worker相当于是计算节点,接收主节点命令与进行状态汇报;Executor负责任务的执行;Client作为用户的客户端负责提交应用,Driver负责控制一个应用的执行,如图1-4所示。

Paste_Image.png

Spark集群部署后,需要在主节点和从节点分别启动Master进程和Worker进程,对整个集群进行控制。在一个Spark应用的执行过程中,Driver和Worker是两个重要角色。Driver程序是应用逻辑执行的起点,负责作业的调度,即Task任务的分发,而多个Worker用来管理计算节点和创建Executor并行处理任务。在执行阶段,Driver会将Task和Task所依赖的file和jar序列化后传递给对应的Worker机器,同时Executor对相应数据分区的任务进行处理。
下面详细介绍Spark的架构中的基本组件。

·ClusterManager:在Standalone模式中即为Master(主节点),控制整个集群,监控Worker。在YARN模式中为资源管理器。

Worker:从节点,负责控制计算节点,启动Executor或Driver。在YARN模式中为NodeManager,负责计算节点的控制

·Driver:运行Application的main()函数并创建SparkContext。

·Executor:执行器,在worker node上执行任务的组件、用于启动线程池运行任务。每个Application拥有独立的一组Executors。

·SparkContext:整个应用的上下文,控制应用的生命周期

·RDD:Spark的基本计算单元,一组RDD可形成执行的有向无环图RDD Graph

·DAG Scheduler:根据作业(Job)构建基于Stage的DAG,并提交Stage给
TaskScheduler。

·TaskScheduler:将任务(Task)分发给Executor执行。

·TaskScheduler:将任务(Task)分发给Executor执行。

·SparkEnv:线程级别的上下文,存储运行时的重要组件的引用。

SparkEnv内创建并包含如下一些重要组件的引用。
·MapOutPutTracker:负责Shuffle元信息的存储。
·BroadcastManager:负责广播变量的控制与元信息的存储。
·BlockManager:负责存储管理、创建和查找块。
·MetricsSystem:监控运行时性能指标信息。
·SparkConf:负责存储配置信息。

Spark的整体流程为:Client提交应用,Master找到一个Worker启动Driver,Driver向Master或者资源管理器申请资源,之后将应用转化为RDD Graph,再由DAGScheduler将RDD Graph转化为Stage的有向无环图提交给TaskScheduler,由TaskScheduler提交任务给Executor执行。在任务执行的过程中,其他组件协同工作,确保整个应用顺利执行。

Spark运行逻辑
如图1-5所示,在Spark应用中,整个执行流程在逻辑上会形成有向无环图(DAG)。Action算子触发之后,将所有累积的算子形成一个有向无环图,然后由调度器调度该图上的任务进行运算。Spark的调度方式与MapReduce有所不同。Spark根据RDD之间不同的依赖关系切分形成不同的阶段(Stage),一个阶段包含一系列函数执行流水线。图中的A、B、C、D、E、F分别代表不同的RDD,RDD内的方框代表分区。数据从HDFS输入
Spark,形成RDD A和RDD C,RDD C上执行map操作,转换为RDD D,RDD B和RDDE执行join操作,转换为F,而在B和E连接转化为F的过程中又会执行Shuffle,最后RDD F通过函数saveAsSequenceFile输出并保存到HDFS中。

Paste_Image.png

Spark分布式架构与单机多核架构的异同

1)在单机多核环境下,多CPU共享内存和磁盘。当系统所需的计算和存储资源不够,需要扩展CPU和存储时,单机多核系统显得力不从心。
2)大规模分布式并行处理系统是由许多松耦合的处理单元组成的,要注意的是,这里指的是处理单元而非处理器。每个单元内的CPU都有自己私有的资源,如总线、内存、硬盘等。这种结构最大的特点在于不共享资源。在不共享资源(Share Nothing)的分布式架构下,节点可以实现无限扩展,即计算能力和存储的扩展性可以成倍增长。

在分布式运算下,数据尽量本地运算,减少网络I/O开销。由于大规模分布式系统要在不同处理单元之间传送信息,在网络传输少时,系统可以充分发挥资源的优势,达到高效率。也就是说,如果操作相互之间没有什么关系,处理单元之间需要进行的通信比较少,则采用分布式系统更好。因此,分布式系统在决策支持(DSS)和数据挖掘(DataMining)方面具有优势。

Hadoop生态系统圈
Web note ad 1