Spark---核心概念(Spark,RDD,Spark的核心构成组件)详解

时间:2024-04-22 07:09:31

一、什么是Spark

Spark就是一个集成离线计算,实时计算,SQL查询,机器学习,图计算为一体的通用的计算框架。

二、Spark特点

1、速度快

相比较于MR,官方说,基于内存计算spark要快mr100倍,基于磁盘计算spark要快mr10倍。
原因:
(1)hadoop执行任务启动的是进程,而spark启动的是线程
(2)hadoop将中间结果保存到磁盘,而spark将中间结果保存到内存,也就是基于内存计算
(3)计算和数据的分离
(4)基于DAGScheduler的计算划分
(5)只有一次的Shuffle输出操作

2、Ease of Use

spark提供超过80多个高阶算子函数,来支持对数据集的各种各样的计算,使用的时候,可以使用Java,scala,Python,R非常灵活易用

3、通用性

在一个项目中,既可以使用离线计算,也可以使用其他比如,SQL查询,机器学习,图计算等等,而这是Spark最最最强大的优势,没有之一。

4、runs everyWhere

spark程序可以在多个平台上面运行

三、RDD概述

何为RDD?其实RDD就是一个不可变的scala的并行集合。
Spark的核心概念就是RDD,指的是一个不可变、可分区、里面元素可并行计算的集合,这个数据的全部或者部分可以缓存在内存中,在多次计算间被重用。

1、RDD的特性

(1)弹性
如果内存充足,那集合数据的存储和计算,就都在内存中完成;如果内存不足,需要有一部分数据溢出到磁盘,然后在磁盘完成存储和计算
(2)分布式
他是被分区的,分为多个分区,每个分区分布在集群中的不同worker节点上面,从而让RDD中的数据可以被并行操作。默认情况下,partition是和hdfs中data-block块对应的,spark加载hdfs文件时,一个data-block块对应一个partition。
所以,对RDD的操作,本质上是对着每一个RDD对应分区partition的操作。
(3)数据集
RDD再抽象来说是一种元素集合,包含了数据。也就是存放数据的集合。而Spark就是对这个RDD及其集合功能算子的实现。
(4)RDD之间是存在依赖关系的
可以自动从节点失败中恢复过来。即如果某个节点上的RDD Partition,因为节点故障,导致数据丢失,那么RDD会自动通过自己的数据来源重新计算该Partition。这一切对使用者是透明的,这一切的背后工作都是通过RDD的lineage(血统,血源)特性来实现的。RDD之间的依赖关系,就形成了一个RDD的有向无环图DAG,依赖关系称之为RDD血缘关系或者血统
(5)移动计算优于移动数据
partition提供最佳计算位置,利于数据处理的本地化即计算向数据移动而不是移动数据

四、RDD在Spark中的地位和作用

1、为什么会有Spark

因为传统的并行计算模型无法有效的进行交互式计算;而Spark的使命便是解决这个问题,这也是它存在的价值和理由。

2、Spark如何解决迭代计算

其主要实现思想就是RDD,把所有计算的数据保存在分布式的内存中。迭代计算通常情况下都是对同一个数据集做反复的迭代计算,数据在内存中将大大降低IO操作。这也是Spark设计的核心:内存计算。

3、Spark如何实现交互式计算

因为Spark是用scala语言实现的,Spark和scala能够紧密的集成。所以Spark可以完美的运用scala的解释器,使得其中的scala可以向操作本地集合对象一样轻松的操作分布式数据集。

4、Spark和RDD的关系

可以理解为:RDD是一种具有容错性,基于内存的集群计算抽象方法,Spark则是这个抽象方法的实现。

五、核心名词解释

1、ClusterManager:在Standalone(上述安装的模式,也就是依托于spark集群本身)模式中即为Master(主节点),控制整个集群,监控Worker。在YARN模式中为资源管理器ResourceManager(国内spark主要基于yarn集群运行,欧美主要基于mesos来运行)。
2、Application:Spark的应用程序,包含一个Driver program和若干Executor。
3、SparkContext:Spark应用程序的入口,负责调度各个运算资源,协调各个Worker Node上的Executor。
4、Worker:从节点,负责控制计算节点,启动Executor。在YARN模式中为NodeManager,负责计算节点的控制,启动的进程叫Container。
5、Driver:运行Application的main()函数并创建SparkContext(是spark中最重要的一个概念,是spark编程的入口,作用相当于mr中的Job)。
6、Executor:执行器,在worker node上执行任务的组件、用于启动线程池运行任务。每个Application拥有独立的一组Executors。
7、DAGScheduler:实现将Spark作业分解成一到多个Stage,每个Stage根据RDD的Partition个数决定Task的个数,然后生成相应的Task set放到TaskScheduler中。DAGScheduler就是Spark的大脑,中枢神经。
8、TaskScheduler:将任务(Task)分发给Executor执行。
9、Stage:一个Spark作业一般包含一到多个Stage。
10、Task:一个Stage包含一到多个Task,通过多个Task实现并行运行的功能。task的个数由rdd的partition分区决定,spark是一个分布式计算程序,所以一个大的计算任务,就会被拆分成多个小的部分,同时进行计算。一个partition对应一个task任务。
11、Transformations:转换(Transformations) (如:map, filter, groupBy, join等),Transformations操作是Lazy的,也就是说从一个RDD转换生成另一个RDD的操作不是马上执行,Spark在遇到Transformations操作时只会记录需要这样的操作,并不会去执行,需要等到有Actions操作的时候才会真正启动计算过程进行计算。
12、Actions:操作/行动(Actions)算子 (如:count, collect, foreach等),Actions操作会返回结果或把RDD数据写到存储系统中。Actions是触发Spark启动计算的动因。