大数据开发工程师-第十周 第2章 解读spark工作与架构原理


第十周 第2章 解读spark工作与架构原理

Spark的工作原理

1
2
下面我们来分析一下Spark的工作原理
来看这个图

b8Fban.md.png

1
2
3
4
5
6
7
  首先看中间是一个Spark集群,可以理解为是Spark的stand alone集群,集群中有6个节点
左边是Spark的客户端节点,这个节点主要负责向Spark集群提交任务,假设在这里我们向Spark集群提交了一个任务
那这个Spark任务肯定会有一个数据源,数据源在这我们使用HDFS,就是让Spark计算HDFS中的数据。
当Spark任务把HDFS中的数据读取出来之后,它会把HDFS中的数据转化为RDD,RDD其实是一个弹性分布式数据集,它其实是一个逻辑概念,在这你先把它理解为是一个数据集合就可以了,后面我们会详细分析这个RDD。
在这里这个RDD你就可以认为是包含了我们读取的HDFS上的数据

其中这个RDD是有分区这个特性的,也就是一整份数据会被分成多份,
1
2
3
4
5
假设我们现在从HDFS中读取的这份数据被转化为RDD之后,在RDD中分成了3份,那这3份数据可能会分布在3个不同的节点上面,对应这里面的节点1、节点2、节点3
这个RDD的3个分区的数据对应的是partiton-1、partition-2、partition-3
这样的好处是可以并行处理了,后期每个节点就可以计算当前节点上的这一个分区的数据。

这个计算思想是不是类似于MapReduce里面的计算思想啊,本地计算,但是有一点区别就是这个RDD的数据是在内存中的。
1
2
3
4
5
6
7
8
9
10
假设现在这个RDD中每个分区中的数据有10w条
那接下来我们就想对这个RDD中的数据进行计算了,可以使用一些高阶函数进行计算,例如:flatMap、map之类的
那在这我们先使用flatMap对数据进行处理,把每一行数据转成多行数据
此时flatMap这个函数就会在节点1、节点2和节点3上并行执行了。
计算之后的结果还是一个带有分区的RDD,那这个RDD我们假设存在节点4、节点5和节点6上面。

此时每个节点上面会有一个分区的数据,我们给这些分区数据起名叫partition-4、partition-5、partition-6
正常情况下,前面节点1上的数据处理之后会发送到节点4上面
另外两个节点也是一样的。
此时经过flatmap计算之后,前面RDD的数据传输到后面节点上面这个过程是不需要经过shuffle的,可以直接在内存中通过网络传输过去,因为现在这两个RDD的分区数量是一一对应的。

什么是RDD

1
2
3
RDD通常通过Hadoop上的文件,即HDFS文件进行创建,也可以通过程序中的集合来创建
RDD是Spark提供的核心抽象,全称为Resillient Distributed Dataset,即弹性分布式数据集
那我们接下来来看一下这个弹性分布式数据集的特点

RDD的特点

1
2
3
4
5
6
7
弹性:RDD数据默认情况下存放在内存中,但是在内存资源不足时,Spark也会自动将RDD数据写入磁盘

分布式:RDD在抽象上来说是一种元素数据的集合,它是被分区的,每个分区分布在集群中的不同节点上,从而让RDD中的数据可以被并行操作

容错性:RDD最重要的特性就是提供了容错性,可以自动从节点失败中恢复过

如果某个节点上的RDD partition,因为节点故障,导致数据丢了,那么RDD会自动通过自己的数据来源重新计算该partition的数据

Spark架构相关进程

1
2
下面我们来看一下Spark架构相关的进程信息
注意:在这里是以Spark的standalone集群为例进行分析
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Driver:
我们编写的Spark程序就在Driver(进程)上,由Driver进程负责执行
Driver进程所在的节点可以是Spark集群的某一个节点或者就是我们提交Spark程序的客户端节点
具体Driver进程在哪个节点上启动是由我们提交任务时指定的参数决定的,这个后面我们会详细分析

Master:
集群的主节点中启动的进程
主要负责集群资源的管理和分配,还有集群的监控等

Worker:
集群的从节点中启动的进程
主要负责启动其它进程来执行具体数据的处理和计算任务

Executor:
此进程由Worker负责启动,主要为了执行数据处理和计算

Task:
是一个线程
由Executor负责启动,它是真正干活的

Spark架构原理

b8V1iR.md.png

1
下面来看一个图,通过刚才那几个进程,我们来分析一下Spark的架构原理
1
2
3
4
5
6
7
8
9
10
11
1. 首先我们在spark的客户端机器上通过driver进程执行我们的Spark代码
当我们通过spark-submit脚本提交Spark任务的时候Driver进程就启动了。
2. Driver进程启动之后,会做一些初始化的操作,会找到集群master进程,对Spark应用程序进行注册
3. 当Master收到Spark程序的注册申请之后,会发送请求给Worker,进行资源的调度和分配
4. Worker收到Master的请求之后,会为Spark应用启动Executor进程
会启动一个或者多个Executor,具体启动多少个,会根据你的配置来启动
5. Executor启动之后,会向Driver进行反注册,这样Driver就知道哪些Executor在为它服务了
6. Driver会根据我们对RDD定义的操作,提交一堆的task去Executor上执行
task里面执行的其实就是具体的map、flatMap这些操作。

这就是Spark架构的原理

本文标题:大数据开发工程师-第十周 第2章 解读spark工作与架构原理

文章作者:TTYONG

发布时间:2022年03月02日 - 10:03

最后更新:2023年05月26日 - 18:05

原始链接:http://tianyong.fun/%E5%A4%A7%E6%95%B0%E6%8D%AE%E5%BC%80%E5%8F%91%E5%B7%A5%E7%A8%8B%E5%B8%88-%E7%AC%AC%E5%8D%81%E5%91%A8-%E7%AC%AC2%E7%AB%A0-%E8%A7%A3%E8%AF%BBspark%E5%B7%A5%E4%BD%9C%E4%B8%8E%E6%9E%B6%E6%9E%84%E5%8E%9F%E7%90%86.html

许可协议: 转载请保留原文链接及作者。

多少都是爱
0%