1.Spark
-
Spark是分布式计算框架
-
与MR的区别
-
1.Spark基于内存迭代处理数据,MR基于磁盘迭代处理数据
-
2.Spark中有DAG有向无环图执行引擎,执行速度快
-
3.Spark是粗粒度资源申请,MR是细粒度资源申请
-
4.MR中只有Mapper,Reducer,相当于Spark中的map和ReduceByKey两个算子,在MR业务逻辑要自己实现,Spark中有各种算子对应各种业务
2.Spark技术栈
-
HDFS,MR,Yarn
-
Hive,Storm
-
SparkCore,SparkStreaming,SparkSQL,SparkMllib
3.Spark运行模式
-
local
用于本地开发测试
-
standalone
Spark自带的资源调度框架
-
yarn
Hadoop生态圈中的资源调度框架
-
Mesos
资源调度框架
4.Spark代码流程
-
1.创建val conf = new SparkConf().setMaster("").setAppName("")
-
2.创建SparkContext val sc = new SparkContext(conf)
-
3.得到RDD val rdd = sc.textFile...
-
4.对得到的RDD使用Transformation类算子进行数据转换
-
5.要使用Action算子对Transformation类算子触发执行
-
6.sc.stop()
5.Spark核心RDD
-
RDD(Resilient Distributed Dateset),弹性分布式数据集
-
五大特性
-
1.RDD是由一系列partition组成
-
2.算子(方法)是作用在partition上的
-
3.RDD之间是有依赖关系的
-
4.分区器是作用在K.V格式的RDD上
-
5.partition对外提供最佳的计算位置,利于数据处理的本地化
6.创建RDD
-
Scala
- sc.textFile(...,minNumpartition)
- sc.parallelize(**,numpartition)
- sc.makeRDD(**,numpartition)
-
Java
- sc.textFile(...,minNumpartition)
- sc.parallelize(**,numpartition)
- sc.parallelizePairs(list(tuple2),numpartition)
7.Spark算子
-
Transformation()
-
Action()
触发Transformation算子
-
持久化算子
8.Spark任务提交
-
standalone
-
client
- 1.在客户端提交Application,Drive在客户端启动
- 2.客户端向Master申请资源,Master返回Worker节点
- 3.Driver向Worker节点发送task,监控task执行,回收结果
-
cluster
- 1.在客户端提交Application,首先客户端向Master申请启动Driver
- 2.Master随机在一台Woker中启动Driver
- 3.Driver启动后,向Master申请资源,Master返回资源
- 4.Driver发送Task,监控task,回收结果
-
Driver的功能
- 1.发送task
- 2.监控task
- 3.申请资源
- 4.回收结果
-
yarn
-
client
- 1.在客户端提交Application,Driver会在客户端启动
- 2.客户端向ResourceManager申请启动ApplicationMaster
- 3.ResourceManager收到请求后,随即在一台NodeManager节点上启动ApplicationMaster
- 4.ApplicationMaster启动之后,向ResourceManager申请资源,用于启动Executor
- 5.ResourceManager收到请求之后,返回给ApplicationMaster一批NodeManager节点
- 6.ApplicationMaster连接NodeManager启动Executor
- 7.Executor启动之后反向注册给Driver
- 8.Driver发送Task,监控Task执行,回收结果
-
cluster
- 1.在客户端提交Application,客户端向ResourceManager申请启动ApplicationMaster
- 2.ResourceManager收到请求后,随即在一台NodeManager节点上启动ApplicationMaster
- 3.ApplicationMaster启动之后,向ResourceManager申请资源,用于启动Executor
- 4.ResourceManager收到请求之后,返回给ApplicationMaster一批NodeManager节点
- 5.ApplicationMaster连接NodeManager启动Executor
- 6.Executor启动之后反向注册给ApplicationMaster(Driver)
- 7.ApplicationMaster(Driver)发送Task,监控Task执行,回收结果
-
ApplicationMaster的功能
- 1.申请资源
- 2.启动Executor
- 3.任务调度
9.术语解释
-
Master(standalone)
资源管理的主节点
-
Cluster Manager
在集群上获取资源的外部服务(例如:standalone,Mesos,Yarn)
-
Worker Node(standalone)
资源的从节点(进程) 或者说管理本机资源的进程
-
Application
基于Spark的用户程序,包含了driver程序和运行在集群上的executor程序
-
Driver Program
用来连接工作进程(Worker)的程序
-
Executor
是在一个worker进程所管理的节点上为某Application启动的一个进程,该进程负责运行任务,并且负责将数据存在内存或者磁盘上。每个应用都有各自独立的executors
-
Task
被送到某个executors上的工作单元
-
Job
包含很多任务(Task)的并行计算,可以看作和action对应
-
Stage
一个Job会被拆分很多组任务,每组任务被称为Stage(就像Mapreduce分Map Task和Reduce task一样)
任务层面
application - job - stage - task
资源层面
Master - Worker - Executor - ThreadPool
10.RDD的宽窄依赖
-
窄依赖
父RDD与子RDD partition之间的关系是一对一的 父RDD与子RDD partition之间的关系是多对一的
-
宽依赖
父RDD与子RDD partition之间的关系是一对多的
11.stage的划分和pipeline计算模式
-
1.stage的并行度由谁决定?
由stage中finalRDD的partition个数决定
-
2.如何提高partition的并行度?
- reduceByKey(***,numpartition)
- join(***,numpartition)
-
3.管道中的数据何时落地?
- shuffle write
- 对RDD进行持久化
12.Spark资源调度和任务调度
1.资源调度
- 1.启动集群,Worker向Master汇报资源,Master掌握了集群资源
- 2.当new SparkConf时,会创建两个对象,DAGScheduler和TaskScheduler
- 3.TaskScheduler向Master申请资源
- 4.Master收到请求,找到满足资源的Worker,启动Executor
- 5.Executor启动之后,反向注册给TaskScheduler,Driver掌握了一批计算资源
2.任务调度
- 6.application中有一个action算子就有一个job,job中有RDD,RDD会形成DAG有向无环图
- 7.DAGScheduler负责将每个job中的DAG按照RDD的宽窄依赖切割job,划分stage,将stage以TaskSet的形式提交给TaskScheduler
- 8.TaskScheduler会遍历TaskSet拿到一个个的task,将task发送到Executor中的ThreadPool中执行
- 9.TaskScheduler监控task执行,回收结果
3.总结
- 1.TaskScheduler可以重试发送失败的task,重试3次,如果这个task依然失败,由DAGScheduler负责重试stage,重试4次,如果依然失败,那么job失败,application失败
- 2.TaskScheduler不仅可以重试失败的task,还可以重试执行缓慢的task,这是Spark中的推测执行机制,默认关闭的,对于ETL的业务场景要关闭
- 3.如果遇到application一直执行不完的情况,1)是否遇到数据倾斜,2)是否开启推测执行
13.粗粒度和细粒度资源申请
1.粗粒度资源申请
每个应用程序的运行环境由一个Dirver和若干个Executor组成,其中,每个Executor占用若干资源,内部可运行多个Task(对应多少个“slot”)。应用程序的各个任务正式运行之前,需要将运行环境中的资源全部申请好,且运行过程中要一直占用这些资源,即使不用,最后程序运行结束后,回收这些资源。举个例子,比如你提交应用程序时,指定使用5个executor运行你的应用程序,每个executor占用5GB内存和5个CPU,每个executor内部设置了5个slot,则Mesos需要先为executor分配资源并启动它们,之后开始调度任务。另外,在程序运行过程中,mesos的master和slave并不知道executor内部各个task的运行情况,executor直接将任务状态通过内部的通信机制汇报给Driver,从一定程度上可以认为,每个应用程序利用mesos搭建了一个虚拟集群自己使用。
2.细粒度资源申请
鉴于粗粒度模式会造成大量资源浪费,Spark On Mesos还提供了另外一种调度模式:细粒度模式,这种模式类似于现在的云计算,思想是按需分配。与粗粒度模式一样,应用程序启动时,先会启动executor,但每个executor占用资源仅仅是自己运行所需的资源,不需要考虑将来要运行的任务,之后,mesos会为每个executor动态分配资源,每分配一些,便可以运行一个新任务,单个Task运行完之后可以马上释放对应的资源。每个Task会汇报状态给Mesos slave和Mesos Master,便于更加细粒度管理和容错,这种调度模式类似于MapReduce调度模式,每个Task完全独立,优点是便于资源控制和隔离,但缺点也很明显,短作业运行延迟大。