一、Spark概念:
Spark 是一种基于内存的快速、通用、可扩展的大数据分析计算引擎。
1、 Spark and Hadoop 的关系
(1)首先从时间节点上来看:
➢Hadoop
➢Spark
(2)从功能上来看:
➢Hadoop
➢Spark
总结:Spark 出现的时间相对较晚,并且主要功能主要是用于数据计算,所以其实 Spark 一直被认为是 Hadoop 框架的升级版。
2、Spark or Hadoop
二、Spark核心模块
三、Spark的运行模式
Spark 作为一个数据处理框架和计算引擎,被设计在所有常见的集群环境中运行, 在国内工作中主流的环境为 Yarn,不过逐渐容器式环境也慢慢流行起来。接下来,我们就分别看看不同环境下 Spark 的运行。
1、Local 模式
所谓的 Local 模式,就是不需要其他任何节点资源就可以在本地执行 Spark 代码的环境,一般用于教学,调试,演示等。
2、Standalone 模式
local 本地模式主要用于练习演示,真实工作中应用需提交到集群执行。接着介绍只使用 Spark 自身节点运行的独立部署(Standalone)模式,该模式体现经典的 master-slave 模式,并展示了集群规划,即 Linux1、Linux3 节点为 Worker,Linux2 节点为 Master 。
3、Yarn 模式
Spark 的独立部署模式由其自身提供计算资源,无需依赖其他框架,降低了与第三方资源框架的耦合性,独立性强。不过,Spark 主要是计算框架,资源调度并非其优势,与专业资源调度框架集成更可靠,国内工作中 Yarn 使用较为普遍。
4、K8S & Mesos 模式
Mesos 是 Apache 下的开源分布式资源管理框架,被称作分布式系统的内核,在 Twitter 广泛应用,管理着超 30 万台服务器上的应用部署。国内仍多使用传统 Hadoop 大数据框架,故 Mesos 框架使用较少,但两者原理相近。
5、Windows 模式
同学们自学时,启动虚拟机与集群过程繁琐,且占用大量系统资源,导致系统运行缓慢,影响学习效果与进度。而 Spark 提供了在 Windows 系统下启动本地集群的方式,使得学习者无需借助虚拟机,就能学习 Spark 基本使用 。
6、部署模式对比
模式 Spark 安装机器数 需启动的进程 所属者 应用场景
Local 1 无 Spark 测试
Standalone 3 Master 及 Worker Spark 单独部署
Yarn 1 Yarn 及 HDFS Hadoop 混合部署
7、端口号
➢Spark 查看当前 Spark-shell 运行任务情况端口号:4040(计算)
➢Spark Master 内部通信服务端口号:7077
➢Standalone 模式下,Spark Master Web 端口号:8080(资源)
➢Spark 历史服务器端口号:18080
➢Hadoop YARN 任务运行情况查看端口号:8088
四、Spark运行架构
1、运行架构:Spark 框架的核心是一个计算引擎,整体来说,它采用了标准 master-slave 的结构。
2、核心组件:对于 Spark 框架有两个核心组件:
(1)Driver
Spark 驱动器节点,用于执行 Spark 任务中的 main 方法,负责实际代码的执行工作。
Driver 在 Spark 作业执行时主要负责:
➢ 将用户程序转化为作业(job)
➢ 在 Executor 之间调度任务(task)
➢ 跟踪 Executor 的执行情况
➢ 通过 UI 展示查询运行情况
实际上,我们无法准确地描述 Driver 的定义,因为在整个的编程过程中没有看到任何有关Driver 的字眼。所以简单理解,所谓的 Driver 就是驱使整个应用运行起来的程序,也称之为Driver 类。
(2)Executor
Spark Executor 是集群中工作节点(Worker)中的一个 JVM 进程,负责在 Spark 作业中运行具体任务(Task),任务彼此之间相互独立。Spark 应用启动时,Executor 节点被同时启动,并且始终伴随着整个 Spark 应用的生命周期而存在。如果有 Executor 节点发生了故障或崩溃,Spark 应用也可以继续执行,会将出错节点上的任务调度到其他 Executor 节点上继续运行。
Executor 有两个核心功能:
3、在 Spark 集群独立部署环境中,Master 和 Worker 是核心组件。Master 作为进程,负责资源调度分配与集群监控,类似 Yarn 中的 ResourceManager(RM);Worker 也是进程,运行于集群服务器,由 Master 分配资源进行数据并行处理计算,类似 Yarn 中的 NodeManager(NM)。在 Hadoop 向 YARN 集群提交应用程序时,ApplicationMaster 是必备部分,它用于向资源调度器申请资源容器,运行任务、监控任务执行、跟踪任务状态及处理异常,实现了 ResourceManager(资源)和 Driver(计算)之间的解耦合 。
五、核心概念
该段文本主要介绍了Spark相关的概念和流程:
1. Executor 与 Core:Spark Executor是工作节点中用于计算的JVM进程,提交应用时可指定计算节点个数及资源(内存和虚拟CPU核数量)。
2.并行度(Parallelism):分布式计算框架中多个任务同时执行,真正实现多任务并行,集群并行执行任务的数量即并行度,取决于框架默认配置,应用程序也可动态修改。
3.有向无环图(DAG):大数据计算引擎框架分四类,Hadoop的MapReduce将计算分Map和Reduce阶段,上层应用拆分算法困难,催生了支持DAG的框架(第二代计算引擎如Tez、Oozie,多为批处理任务),以Spark为代表的第三代计算引擎支持Job内部DAG及实时计算。DAG是由Spark程序映射成的数据流高级抽象模型,可表示程序拓扑结构,是有方向且不会闭环的由点和线组成的拓扑图形。
4.提交流程:开发人员写的应用程序通过Spark客户端提交给Spark运行环境执行计算的流程,不同部署环境提交过程基本相同有细微区别,国内更多将Spark应用部署到Yarn环境,这里提交流程基于Yarn环境。
5、Yarn Client模式中,用于监控和调度的Driver模块在客户端运行,常用于测试。具体流程为:Driver在任务提交的本地机器上启动,随后与ResourceManager通讯申请启动ApplicationMaster;ResourceManager分配container,在合适的NodeManager上启动ApplicationMaster,该Master向ResourceManager申请Executor内存;ResourceManager接到申请后分配container,ApplicationMaster在指定的NodeManager上启动Executor进程;Executor进程启动后反向向Driver注册,全部注册完成后Driver执行main函数;执行到Action算子时触发Job,依据宽依赖划分stage,生成TaskSet,再将task分发到各Executor上执行。
RDD相关概念
Spark 计算框架为了能够进行高并发和高吞吐的数据处理,封装了三大数据结构,用于处理不同的应用场景。三大数据结构分别是:
RDD : 弹性分布式数据集。累加器:分布式共享只写变量。广播变量:分布式共享只读变量
六、RDD
1、RDD:RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是 Spark 中最基本的数据处理模型。代码中是一个抽象类,它代表一个弹性的、不可变、可分区、里面的元素可并行计算的集合。
弹性
可分区、并行计算
2、核心属性
RDD 数据结构中存在分区列表,用于执行任务时并行计算,是实现分布式计算的重要属性。
Spark 在计算时,是使用分区函数对每一个分区进行计算。
RDD 是计算模型的封装,当需求中需要将多个计算模型进行组合时,就需要将多个 RDD 建立依赖关系。
当数据为 K-V 类型数据时,可以通过设定分区器自定义数据的分区。
计算数据时,可以根据计算节点的状态选择不同的节点位置进行计算。
3、执行原理
从计算层面看,数据处理需计算资源(内存和CPU)与计算模型(逻辑),执
行时要协调整合二者。Spark框架执行时,先申请资源,再把应用程序的数据处理逻辑拆解为一个个计算任务,接着将任务发送到已分配资源的计算节点,依据指定计算模型进行数据计算,最终得出计算结果。
4、RDD 序列化
① 闭包检查:在Spark计算中,算子外代码在Driver端执行,算子内代码在Executor端执行,算子内常使用算子外数据形成闭包。若算子外数据无法序列化,就不能传给Executor执行会出错,所以执行任务前要检测闭包内对象能否序列化,此为闭包检测,且Scala2.12版本后闭包编译方式有变化。
② 序列化方法和属性:再次强调算子外代码在Driver端执行,算子内代码在Executor端执行。
③ Kryo序列化框架:Java序列化能处理任何类,但存在字节多、提交对象大的问题。出于性能考虑,Spark2.0开始支持Kryo序列化机制,其速度是Serializable的10倍。RDD在Shuffle数据时,简单数据类型、数组和字符串类型已在Spark内部用Kryo序列化,即便使用Kryo序列化,也需继承Serializable接口。
5、RDD 依赖关系
该段内容主要介绍了RDD的血缘关系、依赖关系、宽窄依赖、阶段和任务划分:
① RDD血缘关系:RDD支持粗粒度转换,通过记录创建RDD的一系列Lineage来保存元数据信息和转换行为,以便在部分分区数据丢失时重新运算和恢复数据。
② RDD依赖关系:指两个相邻RDD之间的关系,包括窄依赖和宽依赖等类型。
③ RDD窄依赖:每个父RDD的Partition最多被子RDD的一个Partition使用,可比喻为“独生子女”。
④ RDD宽依赖:同一个父RDD的Partition被多个子RDD的Partition依赖,会引发Shuffle,可比喻为“多生”。
⑤ RDD阶段划分:DAG有向无环图记录了RDD的转换过程和任务的阶段。
⑥ RDD任务划分:RDD任务切分包括Application(初始化SparkContext生成)、Job(一个Action算子生成一个)、Stage(数量等于宽依赖个数加1)、Task(一个Stage中最后一个RDD的分区个数),且Application->Job->Stage->Task每一层是1对n的关系。
6、创建RDD:在 Spark 中创建 RDD 的创建方式可以分为四种:
1)从集合(内存)中创建 RDD
2)从外部存储(文件)创建 RDD
由外部存储系统的数据集创建 RDD 包括:本地的文件系统,所有 Hadoop 支持的数据集, 比如 HDFS、HBase 等。
val fileRDD: RDD[String] = sparkContext.textFile("spark-core/input")
fileRDD.collect().foreach(println)
3) 从其他 RDD 创建
主要是通过一个 RDD 运算完后,再产生新的 RDD。
4) 直接创建 RDD(new)
使用 new 的方式直接构造 RDD,一般由 Spark 框架自身使用。
RDD并行度与分区
默认情况下,Spark 可以将一个作业切分多个任务(Task)后,发送给 Executor 节点并行计算,而能够并行计算的任务数量我们称之为并行度。这个数量可以在构建 RDD 时指定。记住,这里的并行执行的任务数量,并不是指的切分任务的数量
RDD转换算子:RDD 根据数据处理方式的不同将算子整体上分为 Value 类型、双 Value 类型和 Key-Value 类型。
七、Spark-SQL简介
1、Spark-SQL:
Spark SQL 是 Spark 用于结构化数据(structured data)处理的 Spark 模块。
2、Spark-SQL 特点
3、DataFrame:DataFrame是Spark中一种基于RDD的分布式数据集,具有以下特点:
类似二维表格且带Schema元信息:它类似于传统数据库中的二维表格,每一列都有名称和类型,如DataFrame清楚地知道数据集中包含哪些列及各列的名称和类型,而RDD无法得知所存数据元素的具体内部结构。
支持嵌套数据类型:与Hive类似,支持struct、array和map等嵌套数据类型。
API更友好:DataFrame API提供高层关系操作,比函数式的RDD API更友好,使用门槛更低。
懒执行且性能更高:与RDD一样是懒执行的,但性能比RDD高,因为其查询计划可通过Spark catalyst optimiser进行优化,能得到更优的执行计划。
4、DataSet 是什么
DataSet 是分布式数据集合。DataSet 是 Spark 1.6 中添加的一个新抽象,是 DataFrame 的一个扩展。它提供了 RDD 的优势(强类型,使用强大的 lambda 函数的能力)以及 Spark SQL 优化执行引擎的优点。DataSet 也可以使用功能性的转换(操作 map,flatMap,filter 等等)
➢ DataSet 是 DataFrame API 的一个扩展,是 SparkSQL 最新的数据抽象
➢ 用户友好的 API 风格,既具有类型安全检查也具有 DataFrame 的查询优化特性;
➢ 用样例类来对 DataSet 中定义数据的结构信息,样例类中每个属性的名称直接映射到 DataSet 中的字段名称;
➢ DataSet 是强类型的。比如可以有 DataSet[Car],DataSet[Person]。
➢ DataFrame 是 DataSet 的特列,DataFrame=DataSet[Row] ,所以可以通过 as 方法将 DataFrame 转换为 DataSet。Row 是一个类型,跟 Car、Person 这些的类型一样,所有的表结构信息都用 Row 来表示。获取数据时需要指定顺序
八、Spark-Streaming简介
window等高度抽象
原语进行运算,运算结果能保存到HDFS、数据库等地方。
时间区间数据以RDD形式
存在,是RDD组成的序列,可看作是RDD在实时数据处理场景的封装。
3.特点:
易用:支持Java、Python、Scala等编程语言,编写实时计算程序可像编写离线
程序一样。
容错:无需额外代码和配置就能恢复丢失数据,对实时计算意义重大。
易整合:可在Spark上运行,允许重复使用相同代码进行批处理,实现实时处理
与离线处理
结合及交互式查询操作。
Spark-Streaming架构
Spark-Streaming架构图:
背压机制:这段内容主要介绍了Spark Streaming在数据接收速率控制方面的发展变化: