1.为什么会有Spark
在开始讲Spark运行的整体架构之前,先来讲讲为什么会有Spark?这个框架被设计出来是要解决什么问题的?
Mapreduce是离线大数据处理时经常使用的一种计算模型,但是也有着较多的缺点,例如不适合交互式计算,不适合迭代计算。
比如说,我们进行一个数据计算,流程如下图,这个使用使用MapReduce的话,每个节点可能都要使用一个Map还有一个reduce去表示,那MR1跟MR2之间的结果要怎么传递?就要把结果放在HDFS分布式文件中存储,这样的话带来的问题就是耗时费内存,开销大。
而spark在每个计算节点中是可以通过内存来传递结果的,而且提供了更好的上层API,相比之下Spark就具有了和明显的优势。Spark提供了多种算子做计算,支持多种语言。虽然spark本身没有提供类似于HDFS的分布式文件系统,但是他可以和hadoop生态的众多框架整合,可以访问多种数据库,包括redis都可以整合。
2.Spark的运行架构以及流程
Spark运行的基本流程
由上图,spark在运行的时候一般有如下流程
- 由Driver创建一个SparkContext进行资源申请,任务分配与监控
- 资源管理器给Executor分配资源,申请完毕在worker中启动Executor进程
- SparkContext根据RDD的依赖关系生产DAG图
- DAG图由DAGScheduler解析成Stage,之后把一个个TaskSet提交给底层调度器TaskScheduler处理
- Executor向Sparkcontext申请Task,TaskScheduler将Task发给Executor运行并提供程序代码
- 运行完毕后写入数据并释放资源
涉及到的基本概念
对于Spark运行的流程介绍中涉及到了一些Spark基本概念与名词,下面进行解释
- Driver:该进程调用Spark程序的main方法,并启动SparkContext
- Executor:作为一个进程运行在工作节点WorkerNode,负责运行Task
- RDD:弹性分布式数据集,是分布式内存的抽象概念,后续文章会大篇幅介绍到
- Task:是运行在Excutor上的工作单元
- Job:一个Job包含了多个RDD以及作用于对于RDD上的各种操作。
- Stage:是Job调度的基本单位,一个Job分成多组Task。每组Task被称为Stage,或者称为TaskSet。
- DAG:有向无环图,主要反映RDD之间的依赖关系
- Master:负责管理集群与节点,不参与到计算
- Worker:该进程是一个守护进程,主要负责和外部集群工具打交道,申请或者释放集群资源。
- Client:用户进行程序提交的入口
3.Spark的组成
Spark主要由五大部分组成,这五大部分的内容结构归结起来就可以说是学习Spark的基本路线了,Spark最核心的功能是RDDs,而RDDs就存在于spark-core这个包内,这个包也是spark最核心的部分,提供给了多种上层API,用于不同场景下的计算。
- Spark Core:
Spark-Core是整个Spark的基础。
包含Spark的基本功能,包含任务调度,内存管理,容错机制等,内部定义了RDDs(弹性分布式数据集),提供了很多APIs来创建和操作这些RDDs。为其他组件提供底层的服务。
- Spark SQL:
Spark SQL在spark-core的基础之上又推出一个DataSet与DataFrame的数据抽象化概念。提供了在DataSet与DataFrame之上执行SQL的能力。
Spark SQL处理结构化数据的库,就像Hive SQL,Mysql一样,企业中用来做报表统计。
- Spark Streaming:
Spark streaming充分利用了spark-core的快速调度能力来进行流发计算与分析。是实时数据流处理组件,类似Storm。Spark Streaming提供了API来操作实时流数据。企业中用来从可以Kafka接收数据做实时统计。
- MLlib:
MLlib是Spark上分布式机器学习的框架,是一个包含通用机器学习功能的包,Machine learning lib包含分类,聚类,回归等,还包括模型评估和数据导入。MLlib提供的上面这些方法,都支持集群上的横向扩展。
- Graphx:
Graphx是分布式图计算框架。是用来处理图的库(例如,社交网络图),并进行图的并行计算。像Spark Streaming,Spark SQL一样,它也继承了RDD API。它提供了各种图的操作,和常用的图算法,例如PangeRank算法。
Spark提供了全方位的软件栈,只要掌握Spark一门编程语言就可以编写不同应用场景的应用程序(批处理,流计算,图计算等)。Spark主要用来代替Hadoop的MapReduce部分。
4.总结
到这里我们就完成了集群的搭建与第一个小案例的运行,如果操作过程中遇到问题可以私信我,博主会尽力帮你解答