Spark 复习

309 阅读6分钟

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完全独立,优点是便于资源控制和隔离,但缺点也很明显,短作业运行延迟大。