大数据基础:Spark工做原理及基础概念

导语 | Apache Spark 是专为大规模数据处理而设计的快速通用计算引擎,在数据挖掘和机器学习领域有着普遍的应用,如今也已造成一个高速发展、应用普遍的生态系统。本文将为你们详细介绍 Spark 的核心技术原理,但愿与你们一同交流。文章做者:熊峰,腾讯大数据研发工程师。html


1、Spark 介绍及生态python

Spark是UC Berkeley AMP Lab开源的通用分布式并行计算框架,目前已成为Apache软件基金会的顶级开源项目。至于为何咱们要学习Spark,能够总结为下面三点:mysql


1. Spark相对于hadoop的优点

(1)高性能
web

Spark具备hadoop MR全部的优势,hadoop MR每次计算的中间结果都会存储到HDFS的磁盘上,而Spark的中间结果能够保存在内存,在内存中进行数据处理。算法

(2)高容错sql

  • 基于“血统”(Lineage)的数据恢复:spark引入了弹性分布式数据集RDD的抽象,它是分布在一组节点中的只读的数据的集合,这些集合是弹性的且是相互依赖的,若是数据集中的一部分的数据发生丢失能够根据“血统”关系进行重建。数据库

  • CheckPoint容错:RDD计算时能够经过checkpoint进行容错,checkpoint有两种检测方式:经过冗余数据和日志记录更新操做。在RDD中的doCheckPoint方法至关于经过冗余数据来缓存数据,而“血统”是经过粗粒度的记录更新操做来实现容错的。CheckPoint容错是对血统检测进行的容错辅助,避免“血统”(Lineage)过长形成的容错成本太高。apache

(3)spark的通用性
编程

spark 是一个通用的大数据计算框架,相对于hadoop它提供了更丰富的使用场景。json


spark相对于hadoop map reduce两种操做还提供了更为丰富的操做,分为action(collect,reduce,save…)和transformations(map,union,join,filter…),同时在各节点的通讯模型中相对于hadoop的shuffle操做还有分区,控制中间结果存储,物化视图等。

2. spark 生态介绍

Spark支持多种编程语言,包括Java、Python、R和Scala。在计算资源调度层支持local模式,standalone模式,yarn模式以及k8s等。

同时spark有多组件的支持应用场景,在spark core的基础上提供了spark Streaming,spark SQL,spark Mllib,spark R,GraphX等组件。

spark Streaming用于实时流计算,spark SQL旨在将熟悉的SQL数据库查询与更复杂的基于算法的分析相结合,GraphX用于图计算,spark Mllib用于机器学习,spark R用于对R语言的数据计算。

spark 支持多种的存储介质,在存储层spark支持从hdfs,hive,aws等读入和写出数据,也支持从hbase,es等大数据库中读入和写出数据,同时也支持从mysql,pg等关系型数据库中读入写出数据,在实时流计算在能够从flume,kafka等多种数据源获取数据并执行流式计算。

在数据格式上spark也支持的很是丰富,好比常见的txt,json,csv等格式。同时也支持parquet,orc,avro等格式,这几种格式在数据压缩和海量数据查询上优点也较为明显。

2、spark 原理及特色

1. spark core

Spark Core是Spark的核心,其包含以下几个部分:

(1)spark 基础配置

sparkContext是spark应用程序的入口,spark应用程序的提交和执行离不开sparkContext,它隐藏了网络通讯,分布式部署,消息通讯,存储体系,计算存储等,开发人员只须要经过sparkContext等api进行开发便可。

sparkRpc 基于netty实现,分为异步和同步两种方式。事件总线主要用于sparkContext组件间的交换,它属于监听者模式,采用异步调用。度量系统主要用于系统的运行监控。

(2)spark 存储系统

它用于管理spark运行中依赖的数据存储方式和存储位置,spark的存储系统优先考虑在各节点之内存的方式存储数据,内存不足时将数据写入磁盘中,这也是spark计算性能高的重要缘由。

咱们能够灵活的控制数据存储在内存仍是磁盘中,同时能够经过远程网络调用将结果输出到远程存储中,好比hdfs,hbase等。


(3)spark 调度系统

spark 调度系统主要由DAGScheduler和TaskScheduler组成。

DAGScheduler 主要是把一个Job根据RDD间的依赖关系,划分为多个Stage,对于划分后的每一个Stage都抽象为一个或多个Task组成的任务集,并交给TaskScheduler来进行进一步的任务调度。而TaskScheduler 负责对每一个具体的Task进行调度。


具体调度算法有FIFO,FAIR:

  • FIFO调度:先进先出,这是Spark默认的调度模式。

  • FAIR调度:支持将做业分组到池中,并为每一个池设置不一样的调度权重,任务能够按照权重来决定执行顺序。

2. spark sql

spark sql提供了基于sql的数据处理方法,使得分布式的数据集处理变的更加简单,这也是spark 普遍使用的重要缘由。

目前大数据相关计算引擎一个重要的评价指标就是:是否支持sql,这样才会下降使用者的门槛。spark sql提供了两种抽象的数据集合DataFrame和DataSet。

DataFrame 是spark Sql 对结构化数据的抽象,能够简单的理解为spark中的表,相比较于RDD多了数据的表结构信息(schema).DataFrame = Data + schema

RDD是分布式对象集合,DataFrame是分布式Row的集合,提供了比RDD更丰富的算子,同时提高了数据的执行效率。

DataSet 是数据的分布式集合 ,它具备RDD强类型的优势 和Spark SQL优化后执行的优势。DataSet能够由jvm对象构建,而后使用map,filter,flatmap等操做函数操做。

3. spark streaming

这个模块主要是对流数据的处理,支持流数据的可伸缩和容错处理,能够与Flume和Kafka等已创建的数据源集成。Spark Streaming的实现,也使用RDD抽象的概念,使得在为流数据编写应用程序时更为方便。

4. spark特色

(1)spark 计算速度快

spark将每一个任务构建成DAG进行计算,内部的计算过程经过弹性式分布式数据集RDD在内存在进行计算,相比于hadoop的mapreduce效率提高了100倍。

(2)易于使用

spark 提供了大量的算子,开发只需调用相关api进行实现没法关注底层的实现原理。

通用的大数据解决方案


相较于之前离线任务采用mapreduce实现,实时任务采用storm实现,目前这些均可以经过spark来实现,下降来开发的成本。同时spark 经过spark SQL下降了用户的学习使用门槛,还提供了机器学习,图计算引擎等。

(3)支持多种的资源管理模式

学习使用中能够采用local 模型进行任务的调试,在正式环境中又提供了standalone,yarn等模式,方便用户选择合适的资源管理模式进行适配。

(4)社区支持

spark 生态圈丰富,迭代更新快,成为大数据领域必备的计算引擎。


3、spark 运行模式及集群角色

1. spark运行模式

运行模式

运行类型

说明

local

本地模式

经常使用于本地开发测试,分为local单线程和local-cluster多线程模式

standalone

集群模式

独立模式,在spark本身的资源调度管理框架上运行,该框架采用master/salve结构

yarn

集群模式

在yarn资源管理器框架上运行,由yarn负责资源管理,spark负责任务调度和计算

mesos

集群模式

在mesos资源管理器框架上运行,由mesos负责资源管理,spark负责任务调度和计算

k8s

集群模式

在k8s上运行


2. spark集群角色

下图是spark的集群角色图,主要有集群管理节点cluster manager,工做节点worker,执行器executor,驱动器driver和应用程序application 五部分组成,下面详细说明每部分的特色。

(1)Cluster Manager

集群管理器,它存在于Master进程中,主要用来对应用程序申请的资源进行管理,根据其部署模式的不一样,能够分为local,standalone,yarn,mesos等模式。

(2)worker

worker是spark的工做节点,用于执行任务的提交,主要工做职责有下面四点:

  • worker节点经过注册机向cluster manager汇报自身的cpu,内存等信息。

  • worker 节点在spark master做用下建立并启用executor,executor是真正的计算单元。

  • spark master将任务Task分配给worker节点上的executor并执行运用。

  • worker节点同步资源信息和executor状态信息给cluster manager。

在yarn 模式下运行worker节点通常指的是NodeManager节点,standalone模式下运行通常指的是slave节点。

(3)executor

executor 是真正执行计算任务的组件,它是application运行在worker上的一个进程。这个进程负责Task的运行,它可以将数据保存在内存或磁盘存储中,也可以将结果数据返回给Driver。

(4)Application

application是Spark API 编程的应用程序,它包括实现Driver功能的代码和在程序中各个executor上要执行的代码,一个application由多个job组成。其中应用程序的入口为用户所定义的main方法。

(5)Driver

驱动器节点,它是一个运行Application中main函数并建立SparkContext的进程。application经过Driver 和Cluster Manager及executor进行通信。它能够运行在application节点上,也能够由application提交给Cluster Manager,再由Cluster Manager安排worker进行运行。


Driver节点也负责提交Job,并将Job转化为Task,在各个Executor进程间协调Task的调度。

(6)sparkContext

sparkContext是整个spark应用程序最关键的一个对象,是Spark全部功能的主要入口点。核心做用是初始化spark应用程序所须要的组件,同时还负责向master程序进行注册等。

3. spark其它核心概念

(1)RDD

它是Spark中最重要的一个概念,是弹性分布式数据集,是一种容错的、能够被并行操做的元素集合,是Spark对全部数据处理的一种基本抽象。能够经过一系列的算子对rdd进行操做,主要分为Transformation和Action两种操做。

  • ‍‍‍‍‍Transformation(转换):是对已有的RDD进行换行生成新的RDD,对于转换过程采用惰性计算机制,不会当即计算出结果。经常使用的方法有map,filter,flatmap等。

  • Action(执行):对已有对RDD对数据执行计算产生结果,并将结果返回Driver或者写入到外部存储中。经常使用到方法有reduce,collect,saveAsTextFile等。

(2)DAG

DAG是一个有向无环图,在Spark中, 使用 DAG 来描述咱们的计算逻辑。主要分为DAG Scheduler 和Task Scheduler。

图片出自:https://blog.csdn.net/newchitu/article/details/92796302

(3)DAG Scheduler

DAG Scheduler 是面向stage的高层级的调度器,DAG Scheduler把DAG拆分为多个Task,每组Task都是一个stage,解析时是以shuffle为边界进行反向构建的,每当碰见一个shuffle,spark就会产生一个新的stage,接着以TaskSet的形式提交给底层的调度器(task scheduler),每一个stage封装成一个TaskSet。DAG Scheduler须要记录RDD被存入磁盘物化等动做,同时会须要Task寻找最优等调度逻辑,以及监控因shuffle跨节点输出致使的失败。

(4)Task Scheduler

Task Scheduler 负责每个具体任务的执行。它的主要职责包括

  • 任务集的调度管理;

  • 状态结果跟踪;

  • 物理资源调度管理;

  • 任务执行;

  • 获取结果。

(5)Job

job是有多个stage构建的并行的计算任务,job是由spark的action操做来触发的,在spark中一个job包含多个RDD以及做用在RDD的各类操做算子。

(6)stage

DAG Scheduler会把DAG切割成多个相互依赖的Stage,划分Stage的一个依据是RDD间的宽窄依赖。

在对Job中的全部操做划分Stage时,通常会按照倒序进行,即从Action开始,遇到窄依赖操做,则划分到同一个执行阶段,遇到宽依赖操做,则划分一个新的执行阶段,且新的阶段为以前阶段的parent,而后依次类推递归执行。

child Stage须要等待全部的parent Stage执行完以后才能够执行,这时Stage之间根据依赖关系构成了一个大粒度的DAG。在一个Stage内,全部的操做以串行的Pipeline的方式,由一组Task完成计算。

(7)TaskSet Task

TaskSet 能够理解为一种任务,对应一个stage,是Task组成的任务集。一个TaskSet中的全部Task没有shuffle依赖能够并行计算。


Task是spark中最独立的计算单元,由Driver Manager发送到executer执行,一般状况一个task处理spark RDD一个partition。Task分为ShuffleMapTask和ResultTask两种,位于最后一个Stage的Task为ResultTask,其余阶段的属于ShuffleMapTask。


4、spark做业运行流程

1. spark做业运行流程

spark应用程序以进程集合为单位在分布式集群上运行,经过driver程序的main方法建立sparkContext的对象与集群进行交互。具体运行流程以下:

  • sparkContext向cluster Manager申请CPU,内存等计算资源。

  • cluster Manager分配应用程序执行所须要的资源,在worker节点建立executor。

  • sparkContext将程序代码和task任务发送到executor上进行执行,代码能够是编译成的jar包或者python文件等。接着sparkContext会收集结果到Driver端。

2. spark RDD迭代过程

  • sparkContext建立RDD对象,计算RDD间的依赖关系,并组成一个DAG有向无环图。

  • DAGScheduler将DAG划分为多个stage,并将stage对应的TaskSet提交到集群的管理中心,stage的划分依据是RDD中的宽窄依赖,spark碰见宽依赖就会划分为一个stage,每一个stage中包含来一个或多个task任务,避免多个stage之间消息传递产生的系统开销。

  • taskScheduler 经过集群管理中心为每个task申请资源并将task提交到worker的节点上进行执行。

  • worker上的executor执行具体的任务。


3. yarn资源管理器介绍

spark 程序通常是运行在集群上的,spark on yarn是工做或生产上用的很是多的一种运行模式。

没有yarn模式前,每一个分布式框架都要跑在一个集群上面,好比说Hadoop要跑在一个集群上,Spark用集群的时候跑在standalone上。这样的话整个集群的资源的利用率低,且管理起来比较麻烦。


yarn是分布式资源管理和任务管理管理,主要由ResourceManager,NodeManager和ApplicationMaster三个模块组成。

ResourceManager 主要负责集群的资源管理,监控和分配。对于全部的应用它有绝对的控制权和资源管理权限。


NodeManager 负责节点的维护,执行和监控task运行情况。会经过心跳的方式向ResourceManager汇报本身的资源使用状况。

yarn资源管理器的每一个节点都运行着一个NodeManager,是ResourceManager的代理。若是主节点的ResourceManager宕机后,会链接ResourceManager的备用节点。


ApplicationMaster 负责具体应用程序的调度和资源的协调,它会与ResourceManager协商进行资源申请。ResourceManager以container容器的形式将资源分配给application进行运行。同时负责任务的启停。


container 是资源的抽象,它封装着每一个节点上的资源信息(cpu,内存,磁盘,网络等),yarn将任务分配到container上运行,同时该任务只能使用container描述的资源,达到各个任务间资源的隔离。

4. spark程序在yarn上执行流程

spark on yarn分为两种模式yarn-client模式,和yarn—cluster模式,通常线上采用的是yarn-cluster模式。

(1)yarn-client模式


driver在客户端本地执行,这种模式可使得spark application和客户端进行交互,由于driver在客户端能够经过webUI访问driver的状态。同时Driver会与yarn集群中的Executor进行大量的通讯,会形成客户机网卡流量的大量增长。

(2)yarn-cluster模式


Yarn-Cluster主要用于生产环境中,由于Driver运行在Yarn集群中某一台NodeManager中,每次提交任务的Driver所在的机器都是随机的,不会产生某一台机器网卡流量激增的现象,缺点是任务提交后不能看到日志。只能经过yarn查看日志。

下图是yarn-cluster运行模式:

client 向yarn提交应用程序,包含ApplicationMaster程序、启动ApplicationMaster的命令、须要在Executor中运行的程序等。

ApplicationMaster程序启动ApplicationMaster的命令、须要在Executor中运行的程序等。

ApplicationMaster向ResourceManager注册,这样用户能够直接经过ResourceManage查看应用程序的运行状态。

ApplicationMaster申请到资源(也就是Container)后,便与对应的NodeManager通讯,启动Task。

Task向ApplicationMaster汇报运行的状态和进度,以让ApplicationMaster随时掌握各个任务的运行状态,从而能够在任务失败时从新启动任务。

应用程序运行完成后,ApplicationMaster向ResourceManager申请注销并关闭本身。


参考文献:

[1] Spark on Yarn架构原理:

https://blog.csdn.net/lijingjingchn/article/details/85012470

[1] Spark on Yarn详解:

https://www.cnblogs.com/bigdata1024/p/12116621.html

[1] Spark任务提交方式和执行流程:

https://www.cnblogs.com/frankdeng/p/9301485.html

[1] Spark容错机制:

https://www.cnblogs.com/cynchanpin/p/7163160.html

[1] spark 之 scheduler:

https://mp.weixin.qq.com/s/9g5e5WlmXUyQDXiU6PTGZA?token=1292183487&lang=zh_CN

[1] Spark工做原理:

https://blog.csdn.net/qq_16681169/article/details/82432841

[1] Spark RDD:

https://www.cnblogs.com/zlslch/p/5942204.html

[1] Spark基本概念快速入门:

https://www.leonlu.cc/profession/17-spark-terminology/

[1] spark中dag的介绍:

https://blog.csdn.net/newchitu/article/details/92796302

[2] spark:

https://spark.apache.org/docs/3.0.0-preview/index.html

文章推荐

百亿级实时计算系统性能优化–—Elasticsearch篇