spark工作原理和流程介绍
Spark相关名词解释:
-
Driver
主进程,执行了一个Spark Application的main函数和创建Spark Contex的进程
在Yarn集群中:
Yarn-Cluster Driver进程在集群的节点上
Yarn-Client Driver进程存在本地,方便调试,但是会有大量网络传输,不适合生成环境 -
SparkContext
负责和集群通讯,申请资源,监控集群任务状态 -
Partition
RDD数据量很大,通常需要分区,一般每个机器节点可以作为一个分区,每个分区一个Task(线程)
分区数量一般等于CPU core数量 -
Job
每次执行一个action操作产生一个job,Spark Application中的每个action会被Spark作为Job进行调度 -
Stage
每个Job是一个计算序列的最终结果,而这个序列中能够产生中间结果的计算就是一个stage -
Executor
执行进程,负责在各个节点执行Task -
Task
最小工作单元,负责在Executor上面执行并完成一些特定的工作 -
RDD
分布式弹性数据集,Java对象的集合
RDD在转换和执行之间存在血统关系(Lineage), DAG (有向无环图)
宽依赖 : 一个或者多个父RDD分区对应一个子RDD分区
窄依赖 : 多个父RDD分区对应一个子RDD分区 -
DataFrame
有结构的分布式弹性数据集,用来处理结构化数据,SparkSql基于DataFrame处理数据 -
Shuffle
将集群多个节点的key拉到同一个节点进行聚合操作,比如reduceByKey、join、distinct、repartition会触发shuffle算子操作,分区之间的数据交互其实就是shuffle
Spark工作流程
1.使用Spark-submit提交代码至服务器上
2.创建SparkContext,在SparkContext初始化的时候会创建DAGScheduler和TaskScheduler
3.TaskScheduler会启动一个后台进程去集群Master注册Application,申请任务资源,比如CPU,内存等等
4.Master接收注册请求后会利用自己的资源调度算法,在Spark集群的worker上,为Application启动多个Executor
5.worker会启动Executor,Executor会反向注册到Driver上,Driver结束SparkContext初始化,继续执行代码
6.每次执行到一个action算子,就会创建一个job,同时job会被提交到DAGScheduler
7.DAGScheduler会使用划分算法,将job划分成多个stage,然后每个stage都会创建一个TaskSet,划分stage依据是分区间有无数据交互,也就是Shuffle过程
8.TaskScheduler会把TaskSet中的task通过task分配算法提交到Executor上运行,遵循"计算向数据靠拢",TaskScheduler会根据节点上的数据,将对于的任务丢到该节点上。
9.Executor会创建线程池执行task,每个都会task被封装成TaskRunner.
10.Task有两种,ShuffleMapTask和ResultTask,只有最后一个stage使用resultTask,也就是触发action才会返回结果
11.Spark应用的执行就是stage分批次提交TaskSet到Executor,每个Task针对RDD的一个partition,执行定义的算子,直到所有问题完成
Spark算子
1.TransForm
操作 | 含义 |
---|---|
filter(func) | 筛选出满足函数func的元素, 并返回一个新的数据集 |
map(func) | 将每个元素传递到函数func中, 并将结果返回为一个的数集 |
flatMap(func) | 与map()相似, 但每个输入元素都可以映射到0或多个输出结果 |
groupByKey(func) | 应用于(K,V)键值对的数据集时, 返回一个新的(K,Iterable)形式的数据集 |
reduceByKey(func) | 应用于(K,V)键值对的数据集时, 返回一个新的(K,V)形式的数据集, 其中每个值是将每个key传递到函数func中进行聚合后的结果 |
2.Action
操作 | 含义 |
---|---|
count | 返回数据集元素个数 |
collect() | 以数组形式返回数据集所有元素 |
first() | 返回数据集第一个元素 |
take(n) | 以数组形式返回数据集前n个元素 |
reduce(func) | 聚合数据集中元素 |
foreach(func) | 将数据集中元素传递到函数func中运行 |
熟练掌握
3.惰性机制
只有Action操作才会触发Spark任务计算