Spark相关名词解释:
-
Driver
主进程,执行了一个Spark Application的main函数和创建Spark Contex的进程- 监听属于它这个Spark Application的Executor进程发来的通信和连接
- Driver还要负责调度整个Spark作业的调度和运行,跟Executor进程通信,给Executor分派计算Task
- 在Yarn集群中:
Yarn-Cluster Driver进程在集群的节点上
Yarn-Client Driver进程存在本地,方便调试,但是会有大量网络传输,不适合生成环境
-
Application
Spark应用程序,即用户基于Spark API开发的程序,可以通过一个有main方法的类执行的 -
SparkContext
负责和集群通讯,申请资源,监控集群任务状态 -
Partition
RDD数据量很大,通常需要分区,一般每个机器节点可以作为一个分区,每个分区一个Task(线程)
分区数量一般等于CPU core数量 -
Job
每次执行一个action操作产生一个job,Spark Application中的每个action会被Spark作为Job进行调度 -
Stage
每个Job是一个计算序列的最终结果,而这个序列中能够产生中间结果的计算就是一个stage -
Executor
集群管理器为Application分配的进程,运行在Worker节点上,负责执行作业的任务,并将数据保存在内存或磁盘中,每个Application都有自己的Executor -
Worker
集群中可以运行Application代码的节点。在Standalone模式中指的是通过slave文件配置的worker节点,在Spark on Yarn模式中指的就是NodeManager节点 -
Task
最小工作单元,负责在Executor上面执行并完成一些特定的工作,由Driver发送到Executor上执行的计算单元,每个Task负责在一个阶段(Stage),处理一小片数据,计算出对应的结果 -
RDD
分布式弹性数据集,Java对象的集合
RDD在转换和执行之间存在血统关系(Lineage), DAG (有向无环图)
窄依赖 : 如果父RDD的一个分区只被一个子RDD的一个分区所使用就是窄依赖
宽依赖 : 不满足上述规则的就是窄依赖 ,一个父RDD的一个分区对应一个子RDD的多个分区 -
DataFrame
有结构的分布式弹性数据集,用来处理结构化数据,SparkSql基于DataFrame处理数据 -
Shuffle
将集群多个节点的key拉到同一个节点进行聚合操作,比如reduceByKey、join、distinct、repartition会触发shuffle算子操作,分区之间的数据交互其实就是shuffle
Spark工作流程
-
使用Spark-submit提交代码至服务器上
-
创建SparkContext,在SparkContext初始化的时候会创建DAGScheduler和TaskScheduler
-
TaskScheduler会启动一个后台进程去集群Master注册Application,申请任务资源,比如CPU,内存等等
-
Master接收注册请求后会利用自己的资源调度算法,在Spark集群的worker上,为Application启动多个Executor
-
worker会启动Executor,Executor会反向注册到Driver上,告诉Driver有哪些Executor为其服务,Driver结束SparkContext初始化,继续执行代码
-
每次执行到一个action算子,就会创建一个job,同时job会被提交到DAGScheduler
-
DAGScheduler会使用划分算法,将job划分成多个stage,然后每个stage都会创建一个TaskSet,划分stage依据是分区间有无数据交互,也就是Shuffle过程,同时会把stage提交给TaskScheduler。
-
TaskScheduler会把TaskSet中的task通过task分配算法提交到Executor上运行,遵循"计算向数据靠拢",TaskScheduler会根据节点上的数据,将对应的任务丢到该节点上。
-
Executor会创建线程池执行task,每个都会task被封装成TaskRunner.
-
Task有两种,ShuffleMapTask和ResultTask,只有最后一个stage使用resultTask,也就是触发action才会返回结果
-
Spark应用的执行就是stage分批次提交TaskSet到Executor,每个Task针对RDD的一个partition,执行定义的算子,直到所有问题完成
Spark Standalone运行原理图
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任务计算