大数据系列(六)之 Spark 分布式计算框架

一、Spark是什么? Spark是用于大规模数据处理的统一分析引擎。最初是由加州大学柏克莱分校AMPLab所开发。它提供了Scala,Java,Python和R中的高级API,以及优化的引擎,该引擎支持用于数据分析的通用计算图。它还支持一组丰富的高级工具,包括使用 SQL 处理结构化数据处理的 Spark SQL,用于机器学习的 MLlib,用于图计算的 GraphX,以及 Spark Streaming。
spark的一个主要特点是能够在内存中进行计算,及时依赖磁盘进行复杂的运算,相对于Hadoop的MapReduce会在运行完工作后将中介数据存放到磁盘中来说,Spark依然比MapReduce更加高效。
官网地址:http://spark.apache.org/
二、为什么要用Spark?
我们都知道Hadoop框架虽然优秀,但是也有天然的缺陷,所以Spark应运而生。比如说:
1. MapReduce不能进行实时流计算。实时流处理场景需要数据处理的延迟比较低,需要达到秒级,甚至毫秒级,但是MapReduce处理时间是相对很长的。
2. MapReduce不适用于交互式处理。比如说当收到查询请求,需要快速处理并返回结果,MapReduce不能快速的返回计算结果。 MapReduce不适合处理迭代计算,迭代计算需要不断对Job调度执行,Job之间依赖度比较高,处理逻辑比较复杂。
3. MapReduce只支持Map和Reduce两种语义的操作,如果实现复杂的操作需要开发大量的Map和Reduce程序。
4. MapReduce处理效率低,耗费时间长,具体表现在以下几个方面:
MapReduce是基于磁盘的,无论是MapReduce还是YARN都是将数据从磁盘中加载出来,经过DAG,然后重新写回到磁盘中。
MapReduce计算过程中会经历Suffle阶段,Map段会将中间写入到磁盘,如果数据文件比较大,会多次写入到磁盘,产生很多小文件,当Map任务执行结束之后,会将这些小的文件合并成一个大的文件,要经历多次读取和写入磁盘的操作,非常耗时。如果一个计算逻辑需要多个MapReduce串联,后一个MapReduce任务依赖前一个MapReduce任务的计算结果,那么每个MapReduce任务计算完都会将计算结果写入到HDFS,多个MapReduce之间通过HDFS交换数据,效率非常低,耗时也很长。
MapReduce任务的调度和启动开销也很大(由于MapReduce任务是通过进程的方式启动的),不能充分利用内存资源,而且Map端和Reduce端都需要对数据进行排序,由于MapReduce框架设计的特点决定了它在运行过程中的效率是非常低的,只能满足离线的批处理计算任务。 针对以上的一些介绍,所以MapReduce主要用于离线的分布式批处理计算,所以Spark应运而生。
三、Spark特点
① 运行速度快
Apache Spark官方介绍运行工作负载的速度提高了100倍。 Apache Spark使用最先进的DAG调度程序,查询优化程序和物理执行引擎,实现批量和流式数据的高性能。
② 使用方便 提供了丰富的开发API,可以使用Java,Scala,Python,R和SQL快速编写应用程序。推荐谁用Scala来开发,因为Spark是使用Scala语言来开发的,实现相同的功能Scala所写的代码要比Java少很多。 集成批处理、流处理、交互式计算、机器学习算法、图计算。
③ 运行方式多样(后面会详细介绍) Local Spark Standalone Mode Spark on Mesos Spark on YARN
四、基本概念
在了解Spark架构之前,我们需要先介绍一些必要的概念:
RDD(resillient distributed dataset):弹性分布式数据集。Spark计算都是基于RDD进行的。
Partition:数据分区。即一个RDD的数据可以划分为多少个分区。 窄依赖(NarrowDependency):即子RDD依赖于父RDD中固定的Partition。Narrow-Dependency分为OneToOneDependency和RangeDependency两种。 宽依赖(ShuffleDependency):shuffle依赖,即子RDD对父RDD中的所有Partition都有依赖。
DAG(directed acycle graph):有向无环图。用于反映各RDD之间的依赖关系。
Task:是送到某个Executor上的工作单元,即具体执行任务。Task分为ShuffleMapTask和ResultTask两种。ShuffleMapTask和ResultTask分别类似于Hadoop中的Map和Reduce。Task是运行Application的基本单位,多个Task组成一个Stage,而Task的调度和管理等是由TaskScheduler负责的。
Job:用户提交的作业。一个Job包含多个Task组成的并行计算,往往由Spark Action触发。
Stage:每个Job会被拆分成多组Task,作为一个TaskSet,其名称为Stage,Stage的划分和调度是有DAGScheduler来负责的,Stage有非最终的Stage(Shuffle Map Stage)和最终的Stage(Result Stage) 两种,Stage的边界就是发生shuffle的地方。一个Job可能被划分为一到多个Stage。
DAGScheduler:根据Job构建基于Stage的DAG(Directed Acyclic Graph有向无环图),并提交Stage给TaskScheduler。其划分Stage的依赖依据是根据RDD之间的依赖关系找出开销最小的调度方法。
TaskScheduler:将TaskSet(即Stage)提交给worker运行,每个Executor运行什么Task就是在此处分配的。TaskScheduler维护所有TaskSet,当Executor向Driver发送心跳时,TaskScheduler会根据资源剩余情况分配相应的Task。另外TaskScheduler还维护所有Task的运行标签,重试失败的Task。
在不同运行模式中任务调度器具体为: Spark on Standalone模式为TaskScheduler Yarn-Client模式为YarnClientClusterScheduler Yarn-Cluster模式为YarnClusterScheduler 注意:一个Job=多个Stage,一个Stage=多个同种Task。
五、Spark架构设计
Spark是一个master/slave架构的分布式系统,使用内存计算引擎,提供Cache缓存机制,将RDD缓存到内存或磁盘当中,支持迭代计算和多次数据共享,减少数据读取的IO开销。它的架构主要包含有以下五部分:
5.1 Application
用户编写的 Spark 程序,可以理解为两部分,包含了一个 Driver Program 和集群中多个的 Executor。即Driver功能的代码和分布在集群中多个节点上运行的Executor代码
5.2 Driver
简单的说就是运行Application 的main()函数。Driver的主要功能包括:
负责协调Job的运行和以及Cluster Manager进行交互。
将RDD转换为执行的DAG图,同时把DAG图分为不同的Stage
将Job切割成更小的执行单元,Task,由Executor执行。
启动一个HTTP Server,端口为4040。这个Web UI会把Spark Application运行时的信息展示出来。
Spark中的Driver即运行上述Application的main函数并创建SparkContext,创建SparkContext的目的是为了准备Spark应用程序的运行环境,在Spark中有SparkContext负责与ClusterManager通信,进行资源申请、任务的分配和监控等,当Executor部分运行完毕后,Driver同时负责将SparkContext关闭,通常用SparkContext代表Driver。
5.3 Executor
执行器,是为某个Application运行在worker node上的一个进程。
某个Application运行在worker节点上的一个进程,  该进程负责运行某些Task,每个Application的Executor数量可以通过配置指定(Static Allocation)或者有Spark动态分配(Dynamic Allocation)。Executor的主要功能包括:
负责将数据存到内存或磁盘上
用于读取和写入外部数据源
缓存着计算过程中的数据
每个Application都有各自独立的一批Executor, 在Spark on Yarn模式下,其进程名称为CoarseGrainedExecutor Backend。一个CoarseGrainedExecutor Backend有且仅有一个Executor对象, 负责将Task包装成taskRunner,并从线程池中抽取一个空闲线程运行Task, 这个每一个oarseGrainedExecutor Backend能并行运行Task的数量取决与分配给它的cpu个数。
5.4 Cluter Manager
指的是在集群上获取资源的外部服务。目前有四种类型
Standalon : spark原生的资源管理,由Master负责资源的分配
Apache Mesos:与hadoop MR兼容性良好的一种资源调度框架
Hadoop Yarn: 指Yarn中的资源管理器ResourceManager
Kubernetes:Kubernetes是一种管理containerized的应用的服务。Spark 2.3以后引入了对Kubernetes的支持。
5.5 Worker
从节点,负责控制计算节点,启动Executor或者Driver。
集群中任何可以运行Application代码的节点,在Standalone模式中指的是通过slave文件配置的Worker节点,在Spark on Yarn模式下就是NodeManager节点。
架构设计图如下:
六、Spark核心组件
通常当需要处理的数据量超过了单机尺度(比如我们的计算机有4GB的内存,而我们需要处理100GB以上的数据)这时我们可以选择spark集群进行计算,有时我们可能需要处理的数据量并不大,但是计算很复杂,需要大量的时间,这时我们也可以选择利用spark集群强大的计算资源,并行化地计算,其架构示意图如下:
6.1 Spark Core
Spark Core是大规模并行和分布式数据处理的基础引擎。 核心是分布式执行引擎,Java,Scala和Python API为分布式ETL应用程序开发提供了一个平台。包含Spark的基本功能,包含任务调度,内存管理,容错机制等,内部定义了RDDs(弹性分布式数据集),提供了很多APIs来创建和操作这些RDDs。为其他组件提供底层的服务。 在核心上构建的其他库允许用于流式传输,SQL和机器学习的各种工作负载。 它负责:
内存管理和故障恢复。
在群集上调度,分发和监视作业。
与存储系统交互。
6.2 Spark SQL
Spark处理结构化数据的库,就像Hive SQL,Mysql一样,企业中用来做报表统计。
Spark SQL是Spark中的一个新模块,它使用Spark编程API实现集成关系处理。 它支持通过SQL或Hive查询查询数据。 对于那些熟悉RDBMS的人来说,Spark SQL将很容易从之前的工具过渡到可以扩展传统关系数据处理的边界。
Spark SQL通过函数编程API集成关系处理。 此外,它为各种数据源提供支持,并且使用代码转换编织SQL查询,从而产生一个非常强大的工具。以下是Spark SQL的四个库。
Data Source API
DataFrame API
Interpreter & Optimizer
SQL Service
6.3 Spark Streaming
实时数据流处理组件,类似Storm。Spark Streaming提供了API来操作实时流数据。企业中用来从Kafka接收数据做实时统计。
6.4 MLlib
一个包含通用机器学习功能的包,Machine learning lib包含分类,聚类,回归等,还包括模型评估和数据导入。MLlib提供的上面这些方法,都支持集群上的横向扩展。
6.5 Graphx
处理图的库(例如,社交网络图),并进行图的并行计算。像Spark Streaming,Spark SQL一样,它也继承了RDD API。它提供了各种图的操作,和常用的图算法,例如PangeRank算法。
Spark生态系统组件的应用场景:
七、Spark运行模式
7.1 Spark Standalone Mode
Standalone模式是Spark内部默认实现的一种集群管理模式,这种模式是通过集群中的Master来统一管理资源,而与Master进行资源请求协商的是Driver内部的StandaloneSchedulerBackend(实际上是其内部的StandaloneAppClient真正与Master通信)。
7.2 Spark on Mesos
随着Apache Mesos的不断成熟,一些企业已经在尝试使用Mesos构建数据中心的操作系统(DCOS),Spark构建在Mesos之上,能够支持细粒度、粗粒度的资源调度策略(Mesos的优势),也可以更好地适应企业内部已有技术栈。
7.3 Spark on YARN
YARN模式下,可以将资源的管理统一交给YARN集群的ResourceManager去管理,选择这种模式,可以更大限度的适应企业内部已有的技术栈,如果企业内部已经在使用Hadoop技术构建大数据处理平台。
7.4 其他
原文链接:https://blog.csdn.net/weixin_38497019/article/details/102628048