0.Spark生态系统
Spark内部提供了丰富的开发库,集成了数据分析引擎Spark SQL、图计算框架GraphX、机器学习库MLlib、流计算引擎Spark Streaming。
(1),Spark 生态系统分层
- 数据存储层,以 HDFS 、Tachyon 为代表的一些分布式文件存储系统或各种数据库;
- 资源管理层,Yarn、Mesos 等资源管理器;
- 数据处理引擎:Spark;
- 应用层,以 Spark 为基础产生的众多项目:Spark SQL、Spark Streaming等;
- Spark SQL 提供 HiveQL(通过 Apache Hive 的 SQL 变体 Hive 查询语言)与Spark 进行交互的 API。每个数据库表被当做一个 RDD,Spark SQL 查询被转换为 Spark 操作。
- Spark Streaming 对实时数据流进行处理和控制,它允许程序能够像普通 RDD 一样处理实时数据。
(2),Spark的四大特征
1), 速度快
-
运行速度提高100倍
- Apache Spark使用最先进的DAG调度程序,查询优化程序和物理执行引擎,实现批量和流式数据的高性能。
-
spark比mapreduce快的2个主要原因
1、==基于内存==(1)mapreduce任务后期再计算的时候,每一个job的输出结果会落地到磁盘,后续有其他的job需要依赖于前面job的输出结果,这个时候就需要进行大量的磁盘io操作。性能就比较低。 (2)spark任务后期再计算的时候,job的输出结果可以保存在内存中,后续有其他的job需要依赖于前面job的输出结果,这个时候就直接从内存中获取得到,避免了磁盘io操作,性能比较高 job1---->job2----->job3----->job4----->job5----->job6 对于spark程序和mapreduce程序都会产生shuffle阶段,在shuffle阶段中它们产生的数据都会落地到磁盘。
2、==进程与线程==
(1)mapreduce任务以进程的方式运行在yarn集群中,比如程序中有100个MapTask,一个task就需要一个进程,这些task要运行就需要开启100个进程。 (2)spark任务以线程的方式运行在进程中,比如程序中有100个MapTask,后期一个task就对应一个线程,这里就不在是进程,这些task需要运行,这里可以极端一点: 只需要开启1个进程,在这个进程中启动100个线程就可以了。 进程中可以启动很多个线程,而开启一个进程与开启一个线程需要的时间和调度代价是不一样。 开启一个进程需要的时间远远大于开启一个线程。
2), 易用性
可以快速去编写spark程序通过 java/scala/python/R/SQL等不同语言
3), 通用性
spark框架不在是一个简单的框架,可以把spark理解成一个==生态系统==,它内部是包含了很多模块,基于不同的应用场景可以选择对应的模块去使用
-
sparksql
- 通过sql去开发spark程序做一些离线分析
-
sparkStreaming
- 主要是用来解决公司有实时计算的这种场景
-
Mlib
- 它封装了一些机器学习的算法库
-
Graphx
- 图计算
4), 兼容性
spark程序就是一个计算逻辑程序,这个任务要运行就需要计算资源(内存、cpu、磁盘),哪里可以给当前这个任务提供计算资源,就可以把spark程序提交到哪里去运行
-
standAlone
- 它是spark自带的独立运行模式,整个任务的资源分配由spark集群的老大Master负责
-
yarn
- 可以把spark程序提交到yarn中运行,整个任务的资源分配由yarn中的老大ResourceManager负责
-
mesos
- 它也是apache开源的一个类似于yarn的资源调度平台
1.Spark 基本概念
- Client:客户端进程,负责提交作业.
- Application:用户编写的Spark应用程序通过spark-submit进行提交一个任务就是一个application,包含一个Driver Programma和若干个Executor,一个Application只有一个Spark Context.application(应用)其实就是用spark-submit提交的程序。比方说spark examples中的计算pi的SparkPi。一个application通常包含三部分:从数据源(比方说HDFS)取数据形成RDD,通过RDD的transformation算子和action算子进行计算,将结果输出到console或者外部存储(比方说collect收集输出到文件中)。
- Driver:一个Spark作业有一个 Spark Context,一个Spark Context对应一个Driver进程,作业的main函数运行在Driver中。Driver主要负责Spark作业的解析,以及通过DAGScheduler划分Stage,将Stage转化成TaskSet提交给TaskScheduler任务调度器,进而调度Task到Executor上执行。
- SparkContext:Spark应用程序的入口,负责调度各个运算资源,协调各个WorkNode上的Executor.根据RDD的依赖关系(在代码中的体现就是每一行代码对RDD的相应操作)构建DAG图.
-
Job:一个application当中大致可以分为transformation算子以及action算子,每执行一次Action操作就会产生一个Job,一个Job包含多个RDD及作用于对应RDD上的各种操作,例如 collect, collectAsMap, saveAsTextFile等。
一个程序中如果有多个Action算子,就会有多个job、多个处理流程、多个DAG。 -
RDD:是Resilient Distributed Dataset(弹性分布式数据集)的简称,是分布式内存的一个抽象的分布式对象的集合,本质上是一个只读的分区记录集合。其提供了一种高度受限的共享内存模型,Spark计算操作都是基于RDD进行的。
每个RDD可以分成多个分区(partition),每个分区就是一个数据集片段。一个RDD的不同分区可以保存在集群中的不同节点上,从而可以在集群中不同的节点上进行并行的计算。 - DAG:是Directed Acyclic Graph(有向无环图)的简称,通过RDD之间的依赖关系,可以划分出整个任务的DAG图,DAG的主要作用是用来划分Stage的。
-
DAGScheduler:当用户提交一个job,根据DAG来进行Stage的划分,并提交Stage给TaskScheduler;
Stage的划分依据是宽窄依赖:逆向驱动,正向调用
具体的划分依据:(1),在DAG中进行反向解析,遇到宽依赖就断开,生成一个新的Stage;(2),遇到窄依赖就把当前的RDD加入到Stage中; (3), 将窄依赖尽量添加到同一个Stage中,可以实现流水线的计算 - Stage:是Job的基本调度单位,一个Job会分为多组Task,每组Task被称为Stage,或者也被称为TaskSet,代表了一组关联的、相互之间没有Shuffle依赖关系的任务组成的任务集.
- Task:任务 是 spark中最小的执行单元 ,负责处理RDD的计算逻辑.
- TaskSet:一个Stage对应一个TaskSet(任务集),其中task的个数和分区的个数保持一致。
- TaskScheduler:将TaskSet提交给WorkNode节点运行并返回结果.
- Executor:是运行在工作节点(WorkerNode)的一个进程,负责启动多个线程运行Task的,并且负责将数据存在内存或者磁盘中;每一个Application都会申请各自的Executor来处理任务.
- Catche:Spark提供了对RDD不同级别的缓存策略,分别可以缓存到内存、磁盘、外部分布式内存存储系统Tachyon等。
- ClusterManager:在集群上获取资源的外部服务(例如Standalone、Mesos、Yarn)
- TransformAction:Spark API中的一种类型,Transformation的返回值仍然是RDD,所有的TransformAction操作都是采用延迟执行(惰性机制)的方式,在逻辑上定义了RDD的依赖关系和计算逻辑,但并不会真正触发执行动作。
- Action:是Spark API的一种类型,Action返回值不是一个RDD,而是一个Scala集合;计算只有在Action在提交的时候才会被触发。
- SparkEnv:是线程级别的上下文,存储运行的重要组件的引用.
2.Spark集群架构
(1),架构简介
-
Driver
- 它会执行客户端写好的main方法,它会构建一个名叫SparkContext对象
- 该对象是所有spark程序的执行入口
- 它会执行客户端写好的main方法,它会构建一个名叫SparkContext对象
-
Application
- 就是一个spark的应用程序,它是包含了客户端的代码和任务运行的资源信息
-
ClusterManager
它是给程序提供计算资源的外部服务-
standAlone
- 它是spark自带的集群模式,整个任务的资源分配由spark集群的老大Master负责
-
yarn
- 可以把spark程序提交到yarn中运行,整个任务的资源分配由yarn中的老大ResourceManager负责
-
mesos
- 它也是apache开源的一个类似于yarn的资源调度平台。
-
standAlone
-
Master
- 它是整个spark集群的主节点,负责任务资源的分配
-
Worker
- 它是整个spark集群的从节点,负责任务计算的节点
-
Executor
- 它是一个进程,它会在worker节点启动该进程(计算资源)
-
Task
- spark任务是以task线程的方式运行在worker节点对应的executor进程中
(2),架构特点
- (1).每个Application都有自己专属的Executor进程,并且该进程在Application运行期间一直驻留。Executor进程以多线程的方式运行Task。
- (2).Spark运行过程与资源管理器(Yarn/Mesos)无关,只要能够获取Executor进程并保持通信即可。
- (3).Task采用了数据本地性(即分发任务(Task)的时候优先把任务放到数据所在的机器中,让数据在本地,不需要回来的跨机器传输数据)和推测执行(即当数据分配到当前机器中,但是当前机器资源不足,它会优先判断是新开一个节点还是等待当前机器节点的资源进行释放再去执行,那一个开销小,它内部是有一个智能化的机制的)等优化机制。