Spark设计与运行原理,基本操作
1.Spark已打造出结构一体化、功能多样化的大数据生态系统,请用图文阐述Spark生态系统的组成及各组件的功能。
目前,Spark生态系统已经发展成为一个可应用于大规模数据处理的统一分析引擎,它是基于内存计算的大数据并行计算框架,适用于各种各样的分布式平台系统。在Spark生态圈中包含了Spark SQL、Spark Streaming、GraphX、MLlib等组件,这些组件可以非常容易地把各种处理流程整合在一起,而这样的整合,在实际数据分析过程中是很有意义的。不仅如此,Spark的这种特性还大大减轻了原先需要对各种平台分别管理的依赖负担。下面,通过一张图描述Spark的生态系统,具体如下图1所示。
一 SparkContext
1 Spark程序的灵魂 ,用来创建最开始的RDD ;
2 在创建SparkContext 过程中 ,创建了 RpcEndPoint / DAGScheduler / TaskScheduler / ShuffleManager / BlockManager等 ,这些统称为 Driver ;
3 一个 SparkContext 就对应一个 Driver ;
4 一个 Application 中只能有一个SparkContext .
二 RDD
1 什么是RDD
RDD 的全称是 Resilient Distributed Dataset ,是一个弹性的 ,可复原(可容错)的分布式数据集 .
是 Spark 中最基本的抽象数据集,是一个不可变的 / 有多个分区的 / 可以并行计算的集合 . RDD 中并不装真正要计算的数据 ,而装的是描述信息 ,描述以后从哪里读取数据 ,调用了什么方法 ,传入了什么函数 ,以及依赖关系等 .
可以认为是一个代理 ,你对RDD进行操作 ,相当于在Driver端先是记录下计算的描述信息 ,然后生成Task ,将Task 调度到 Executor端才执行真正的计算逻辑 .
三 Application
1 使用 SparkSubmit 提交的一个计算应用 ;
2 一个Application 中可以触发多次 Action ,触发一次 Action 产生一个 Job ;
3 一个Application 中可以有一到多个 Job .
四 DAG
1 DAG 是指有向无环图(有方向 ,无闭环) ;
2 是对多个RDD转换过程和依赖关系的描述 ;
3 触发 Action 就会形成一个完整的 DAG ,一个DAG 对应一个 Job .
五 Job
1 Driver 端向 Executor 提交的作业 ,触发一次 Action 形成一个完整的 DAG ;
2 一个DAG 对应一个 Job ;
3 一个Job 中有一到多个Stage ,一个Stage 对应一个TaskSet ,一个TaskSet 中有一到多个 Task .
六 Stage
1 Stage 是指任务执行阶段 ;
2 Stage 执行是有先后顺序的 ,先执行前面的 ,再执行后面的 ;
3 一个Stage 对应一个TaskSet ,一个TaskSet 中的 Task 的数量取决于Stage 中最后一个RDD 分区的数量 .
七Task
1 是Spark中任务最小的执行单位 ,Task 分类两种 ,即 ShuffleMapTask 和 ResultTask .
ShuffleMapTask :
1) 可以读取各种数据源的数据
2) 也可以读取shuffle后的数据
3) 专门为shuffle做准备
ResultTask :
1) 可以读取各种数据源的数据
2) 也可以读取shuffle后的数据
3) 专门为了产生计算结果
2 Task 其实就是类的实例 ,有属性(从哪里读取数据/读取的是哪个切片的数据) ,有方法(如何计算 / 即数据的计算分析逻辑) ;
3 Task 的数量取决于Stage 中最后一个RDD分区的数量 ,Task 的数量决定并行度(分区数) ,同时也要考虑Spark 中可用的 cores .
首先说一句,master和worker是物理节点,driver和executor是进程。
1,master和worker节点
搭建spark集群的时候我们就已经设置好了master节点和worker节点,一个集群有多个master节点和多个worker节点。
master节点常驻master守护进程,负责管理worker节点,我们从master节点提交应用。
worker节点常驻worker守护进程,与master节点通信,并且管理executor进程。
PS:一台机器可以同时作为master和worker节点(举个例子:你有四台机器,你可以选择一台设置为master节点,然后剩下三台设为worker节点,也可以把四台都设为worker节点,这种情况下,有一个机器既是master节点又是worker节点)
2,driver和executor进程
driver进程就是应用的main()函数并且构建sparkContext对象,当我们提交了应用之后,便会启动一个对应的driver进程,driver本身会根据我们设置的参数占有一定的资源(主要指cpu core和memory)。下面说一说driver和executor会做哪些事。
driver可以运行在master上,也可以运行worker上(根据部署模式的不同)。driver首先会向集群管理者(standalone、yarn,mesos)申请spark应用所需的资源,也就是executor,然后集群管理者会根据spark应用所设置的参数在各个worker上分配一定数量的executor,每个executor都占用一定数量的cpu和memory。在申请到应用所需的资源以后,driver就开始调度和执行我们编写的应用代码了。driver进程会将我们编写的spark应用代码拆分成多个stage,每个stage执行一部分代码片段,并为每个stage创建一批tasks,然后将这些tasks分配到各个executor中执行。
executor进程宿主在worker节点上,一个worker可以有多个executor。每个executor持有一个线程池,每个线程可以执行一个task,executor执行完task以后将结果返回给driver,每个executor执行的task都属于同一个应用。此外executor还有一个功能就是为应用程序中要求缓存的 RDD 提供内存式存储,RDD 是直接缓存在executor进程内的,因此任务可以在运行时充分利用缓存数据加速运算。
3.在PySparkShell尝试以下代码,观察执行结果,理解sc,RDD,DAG。请画出相应的RDD转换关系图。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
>>> sc >>> lines = sc.textFile( "file:///home/hadoop/my.txt" ) >>> lines >>> words = lines.flatMap( lambda line:line.split()) >>> words >>> wordKV = words. map ( lambda word:(word, 1 )) >>> wordKV >>> lineKV = lines. map ( lambda line:( 1 ,line)) >>> lineKV >>> lines.foreach( print ) >>> words.foreach( print ) >>>wordKV.foreach( print ) >>>lineKV.foreach( print ) |
关系转换图: