Spark框架核心原理详解(持续更新)

本文详细介绍了Spark框架的核心知识,包括Spark的组成如RDD、SQL、Streaming、MLlib和GraphX,对比了Spark与Hadoop的区别,重点解析了Spark程序执行过程中的组件作用,如Driver、Master、Worker、Executor和Task,并深入探讨了RDD的概念、计算函数和依赖类型。通过理解Spark的任务执行流程,展示了分布式计算节点任务的分配机制。
摘要由CSDN通过智能技术生成

引言

前面有一篇博客记录了Spark在Windows系统上的安装配置过程,由于工作需要使用了一段时间,这就篇系统地梳理一下Spark框架的核心知识作为备忘。

spark框架组成

Spark RDD:离线批处理;
Spark SQL:交互式查询;
Spark Streaming:流式计算;
Spark MLlib:机器学习;
Spark GraphX:图计算;

Spark与Hadoop框架对比

组件差异看如下架构:
在这里插入图片描述
说明:
a、Spark诞生并不是为了替代Hadoop,而是主要替换MapReduce计算框架及基于此计算框架的一系列组件,如Pig、Hive等;
b、Spark的核心是一种新的大数据内存计算框架,可以基于Hadoop的存储(HDFS)与资源管理器(YARN)之上的计算框架。

Spark程序执行过程

要理解Spark任务执行过程,需要搞清楚Spark五大组件(Driver、Master、Worker、Executor、Task)的作用。

  1. Driver ,是一个进程,我们提交编写好的Spark程序就是在Driver进程上,由Driver进程执行,充当Driver的可能是Spark集群的某个节点、也有可能是你提交Spark程序的机器,这个取决于你的Spark运行模式,他是有不一样的。也就是说我们在哪台机器提交运行程序,Spark将会使用它充当Driver角色。在某些公司正式集群是有专门的提交程序运行的机器,有的也是直接拿集群的Master节点来充当Driver运行程序,也有选举集群某个节点来充当Driver节点。
  2. Master,是一个进程,我们可以在搭建好的集群通过最简单的命令jps来查看我们已经运行了哪些进程。Master主要是负责资源的调度和分配,还有集群的监控等职责。
  3. Worker,是一个进程,主要是负责有,一是用自己的内存,存储RDD的某些partition数据;另一个是启动Executor进程及其线程对RDD上的partition进行运行的处理和计算 。
  4. Executor,是一个进程,在一个Executor进程里面会有多个task线程。这里的Executor和task就主要负责执行对RDD的partition进行并行的计算,也就是执行我们的RDD算子,如map、flatMap、reduceByKey等。
  5. Task,是Executor进程的一个线程,主要是负责实际的执行算子任务。

结合以下流程图,我们分析下任务的执行过程。
在这里插入图片描述这里我们通过搭建Standalone模式集群来分析Spark运行架构原理,这里我们有3个节点,1个master、2个worker节点。机器的选举主从节点,是可以在搭建环境的时候,配置文件里面指定机器为Master还是Worter节点。
执行步骤:

A. 提交我们编写好的Spark应用程序,执行提交命令的进程充当Driver节点;每当Driver进程被启动之后,首先它将发送请求到Master进程上,进行Spark应用程序的注册,也就是我们要让Master进程知道,现在有一个新的Spark应用程序要运行了。
B. Master进程在接收到Spark应用程序的注册申请之后,会发送给Worker进程,让其进行资源的调度和分配。这也说明资源分配是由Worker进程来分配管理。
C. Worker进程接收到Master进程的请求之后会为Driver进程启动若干Executer进程并分配好资源;
D. Executer启动分配好资源后,就会向Driver进行反注册,这时Driver进程就知道哪些Executer进程为它服务;
E. 当Driver需要的Executer进程注册完毕后,就可以正式执行我们的应用程序。以HDFS数据源为例,先读取HDFS文件到多个worker进程中,形成初始RDD,再执行之后的一系列算子;
F. Driver进程根据用户的应用程序中的一系列算子构建若干job任务,job任务最终分解成若干task提交给Executor进程,Executor进程为每一个task创建一个线程运行;
G. task从当前节点的worker进程访问对应自己任务的数据(就是RDD的partition)来执行指定的算子操作,形成新的RDD的partition,当该轮Driver进程向Executor进程派发的task执行结束,然后Driver基于新生成的RDD的partition数据,继续执行用户的应用程序,形成新一批task提交给Executor进程执行,循环这个操作直到用户的应用程序的所有算子执行结束。

深入理解RDD

RDD是什么?

RDD(Resilient Distributed Datasets),即弹性分布式数据集。它是对数据的高度抽象概念,弹性可理解为数据存储弹性,可内存,可磁盘; 分布式可理解为数据分布在不同节点。
RDD是分布式数据的逻辑抽象,物理数据存储在不同的节点上,但对用户透明,用户不需要知道数据实际存在哪台机器。

RDD包含的信息:
只读分区集合:这保证了RDD的一致性,在计算过程中更安全可靠,此外RDD可能包含多个分区,数据分布在不同分区中,这些分区可能在不同的机器上;
对数据的计算函数:RDD包含了对所表示数据的计算函数,也就是得到这个RDD所要经过的计算,包含transformation和action两类;
计算数据的位置:对用户而言不需要知道数据在哪里,这些信息隐含在RDD的结构中;
分区器:对数据分区依赖的分区算法,如hash分区器;
依赖的RDD信息:该RDD可能依赖的父RDD信息,用于失败重算或计算的DAG划分。

RDD提供了哪些计算函数(算子)?

RDD的计算分为transformation和action两类:

  1. transformation有 flatMap、map、union、reduceByKey等;
  2. action有count、collect、saveAsTextFile等表示输出的操作;

RDD的计算是lazy的,transformation算子不会引发计算,只是逻辑操作,action算子才会引发实际的计算。

RDD算子的宽窄依赖如何区分?

下图左侧为宽依赖,右侧为窄依赖:
在这里插入图片描述
shuffle可理解为数据的从原分区打乱重组到新的分区;
对于上图中的宽依赖,父RDD的4号分区数据划分到子RDD的多个分区(一分区对多分区),这就表明有shuffle过程,父分区数据经过shuffle过程的hash分区器(也可自定义分区器)划分到子RDD。

上图中右边的窄依赖,父RDD的每个分区的数据直接到子RDD的对应一个分区(一分区对一分区),例如1号到5号分区的数据都只进入到子RDD的一个分区,这个过程没有shuffle。

Spark中Stage的划分就是通过shuffle来划分。

怎么进行分布式计算的节点任务分配?

集群管理器(Standalone模式为Master进程,On Yarn模式为yarn)为用户应用程序分配了计算节点之后,Spark的运行架构可以简单地视作由Driver进程和若干Executor进程组成,Driver负责把用户代码进行DAG切分,划分为不同的Stage,然后把每个Stage包含的若干个task调度都提交到同一个Executor进行计算,这样一个Executor进程就并行执行同一个Stage的所有task。
在这里插入图片描述
spark作业的划分层次如下图:
在这里插入图片描述
作业层次划分依据:

  1. Job划分:action算子;
  2. Stage划分:shuffle操作;
  3. Task划分:分区数;

Application就是用户submit提交的整体代码,代码中又有很多action算子,action算子把Application划分为多个job,job根据宽依赖划分为不同Stage,Stage内划分为许多(数量由分区决定,一个分区的数据由一个task计算)功能相同的task,然后这些task提交给Executor进行计算执行,把结果返回给Driver汇总或存储。

这体现了 Driver端总规划 —> Executor端分计算 —> 结果最后汇总回Driver 的思想,也是“Master-Worker”模式。

下图为一个简单的例子,请仔细理解:
在这里插入图片描述

参考资料

[1].大数据之谜
[2].https://blog.csdn.net/xwc35047/article/details/60330528

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值