Spark理论知识

Spark简介

2009年诞生于美国加州大学伯克利分校AMP实验室。Apache Spark是一种基于内存的快速、通用、可扩展的大数据计算引擎。Spark 是一站式解决方案,集批处理、实时流处理、交互式查询、图计算与机器学习于一体。

spark特点

  • 轻:Spark核心代码有3万行。
    Scala语言的简洁和丰富表达力。巧妙利用了Hadoop和Mesos的基础设施。
  • 快:Spark对小数据集可达到亚秒级的延迟。
    对大数据集的迭代机器学习即席查询、图计算等应用,Spark 版本比基于MapReduce、Hive和Pregel的实现快。内存计算、数据本地性和传输优化、调度优化。
  • 灵:Spark提供了不同层面的灵活性。
    Scala语言trait动态混入策略(如可更换的集群调度器、序列化库)。允许扩展新的数据算子、新的数据源、新的language bindings 。Spark支持内存计算、多迭代批量处理、即席查询、流处理和图计算等多种范式。
  • 巧:巧妙借力现有大数据组件。
    Spark借Hadoop之势,与Hadoop无缝结合。图计算借用Pregel和PowerGraph的API以及PowerGraph的点分割思想。

Spark与MapReduce

在这里插入图片描述

  • Spark计算过程数据部落盘,结果不落盘。Mapreduce数据存放本地,结果溢出时存放本地。性能上提升高于100倍(全内存计算)。
  • Spark的中间数据放在内存中,对于迭代运算、批处理计算的效率更高,延迟更低。
  • 提供更多的数据集操作类型,编程模型更灵活,开发效率更高。
  • 更高的容错能力(血统机制)。
  • Spark用十分之一的资源,获得3倍与Mapreduce的性能。

Spark体系

在这里插入图片描述

  • SparkCore:类似于MR的分布式内存计算框架,最大的特点是将中间计算结果直接放在内存中,提升计算性能。自带了Standalone模式的资源管理框架,同时,也支持YARN、MESOS的资源管理系统。FI集成的是Spark On Yarn的模式。其它模式暂不支持。
  • SparkSQL:Spark SQL是一个用于处理结构化数据的Spark组件,作为Apache Spark大数据框架的一部分,主要用于结构化数据处理和对数据执行类SQL查询。通过Spark SQL,可以针对不同数据格式(如:JSON,Parquet, ORC等)和数据源执行ETL操作(如:HDFS、数据库等),完成特定的查询操作。
  • SparkStreaming:微批处理的流处理引擎,将流数据分片以后用SparkCore的计算引擎中进行处理。相对于Storm,实时性稍差,优势体现在吞吐量上。
  • Mllib和GraphX主要一些算法库。

Spark核心概念RDD

在这里插入图片描述

  • RDD(Resilient Distributed Datasets) 即弹性分布式数据集,是一个只读的,可分区的分布式数据集。
  • RDD 默认存储在内存,当内存不足时,溢写到磁盘。
  • RDD 数据以分区的形式在集群中存储。
  • RDD 具有血统机制( Lineage ),发生数据丢失时,可快速进行数据恢复。
  • RDD是Spark对基础数据的抽象。
    • RDD的生成:从Hadoop文件系统(或与Hadoop兼容的其它存储系统)输入创建(如HDFS);从父RDD转换得到新的RDD。
    • RDD的存储:用户可以选择不同的存储级别存储RDD以便重用(11种);RDD默认存储于内存,但当内存不足时,RDD会溢出到磁盘中。
    • RDD的分区:为减少网络传输代价,和进行分布式计算,需对RDD进行分区。在需要进行分区时会根据每条记录Key进行分区,以此保证两个数据集能高效进行Join操作。
    • RDD的优点:RDD是只读的,静态的。因此可提供更高的容错能力;可以实现推测式执行。

RDD的依赖关系

在这里插入图片描述

  1. 窄依赖是指父RDD的每个分区最多被一个子RDD的一个分区所用。一个爸爸只有一个孩子。
  2. 宽依赖是指父RDD的每个分区对应一个子RDD的多个分区,是stage划分的依据。一个爸爸有多个孩子。
  3. Lineage(血统):依赖的链条
  4. RDD数据集通过Lineage记住了它是如何从其他RDD中演变过来的。

RDD的Stage划分

在这里插入图片描述
实际应用提交的Job中RDD依赖关系是十分复杂的,依据这些依赖关系来划分stage自然是十分困难的,Spark此时就利用了前文提到的依赖关系,调度器从DAG图末端出发,逆向遍历整个依赖关系链,遇到ShuffleDependency(宽依赖关系的一种叫法)就断开,遇到NarrowDependency就将其加入到当前stage。stage中task数目由stage末端的RDD分区个数来决定,RDD转换是基于分区的一种粗粒度计算,一个stage执行的结果就是这几个分区构成的RDD。

RDD的算子

  • Transformation
    Transformation是通过转换从一个或多个RDD生成新的RDD,该操作是lazy的,当调用action算子,才发起job。
    典型算子:map、flatMap、filter、reduceByKey等。
  • Action
    当代码调用该类型算子时,立即启动job。
    典型算子:take、count、saveAsTextFile等。

Spark的任务调度

在这里插入图片描述

  1. DAGSchedule将Job划分一个个stage。每个stage对应一个TaskSet,TaskSet由一组业务逻辑完全相同只是数据不同的Task组成。这些TaskSet最终被提交给TaskSchedule。
  2. 每个TaskSchedule都对应一个ScheduleBackend。TaskSchedule负责Application的不同Job之间的调度,在Task执行任务失败时启动重试机制,并且为执行速度慢的Task启动备份的任务。
  3. ScheduleBackend负责与Cluster Manger(如Resource Manager)交互,取得该Application分配到的资源,并将这些资源传给TaskSchedule,由TaskSchedule为Task最终分配计算资源。

Spark on Yarn-client

在这里插入图片描述

  1. 客户端向ResourceManager发送Spark应用提交请求,ResourceManager为其返回应答,该应答中包含多种信息(如ApplicationId、可用资源使用上限和下限等)。client端将启动ApplicationMaster所需的所有信息打包,提交给ResourceManager上。
  2. ResourceManager收到请求后,会为ApplicationMaster寻找合适的节点,并在该节点上启动它。ApplicationMaster是Yarn中的角色,在Spark中进程名字是ExecutorLauncher。
  3. 根据每个任务的资源需求,ApplicationMaster可向ResourceManager申请一系列用于运行任务的Container。
  4. 当ApplicationMaster(从ResourceManager端)收到新分配的Container列表后,会向对应的NodeManager发送信息以启动Container。ResourceManager分配Container给SparkContext,SparkContext和相关的NodeManager通讯,在获得的Container上启动 CoarseGrainedExecutorBackend,CoarseGrainedExecutorBackend启动后,开始向SparkContext注册并申请Task。
  5. SparkContext分配Task给CoarseGrainedExecutorBackend执行。CoarseGrainedExecutorBackend执行Task并向SparkContext汇报运行状况。

Spark on Yarn-cluster

在这里插入图片描述

  1. client生成Application信息,提交给ResourceManager。
  2. ResourceManager为Spark Application分配第一个Container(ApplicationMaster),并在该Container上启动Driver。
  3. ApplicationMaster向ResourceManager申请资源以运行Container。ResourceManager分配Container给ApplicationMaster,ApplicationMaster和相关的NodeManager通讯,在获得的Container上启动
    Executor,Executor启动后,开始向Driver注册并申请Task。
  4. Driver分配Task给Executor执行。
  5. Executor执行Task并向Driver汇报运行状况。

Spark SQL概述

Spark SQL是Spark中用于结构化数据处理的模块。在Spark应用中,可以无缝的使用SQL语句亦或是DataFrame API对结构化数据进行查询。Spark SQL将SQL语言解析成RDD,再由Spark Core执行。

Dataset

DataSet是一个由特定域的对象组成的强类型集合,可通过功能或关系操作并行转换其中的对象。
DataSet以Catalyst逻辑执行计划表示,该计划描述了产生数据所需的计算,并且数据以编码的二进制形式存储,不需要反序列化就可以执行sort、filter、shuffle等操作。
Dataset是“懒惰”的,只在执行action操作时触发计算。当执行action操作时,Spark用查询优化程序来优化逻辑计划,并生成一个高效的并行分布式的物理计划。
Dataset是一个新的数据类型。Dataset与RDD高度类似,性能比较好。Dataset 与 RDD 相似, 然而, 并不是使用 Java 序列化或者 Kryo 编码器来序列化用于处理或者通过网络进行传输的对象。 虽然编码器和标准的序列化都负责将一个对象序列化成字节,编码器是动态生成的代码,并且使用了一种允许 Spark 去执行许多像 filtering, sorting 以及 hashing 这样的操作, 不需要将字节反序列化成对象的格式。
jvm中存储的java对象可以是序列化的,也可以是反序列化的。序列化的对象是将对象格式化成二进制流,可以节省内存。反序列化则与序列化相对,是没有进行二进制格式化,正常存储在jvm中的一般对象。RDD可以将序列化的二进制流存储在jvm中,也可以是反序列化的对象存储在JVM中。至于现实使用中是使用哪种方式,则需要视情况而定。例如如果是需要最终存储到磁盘的,就必须用序列化的对象。如果是中间计算的结果,后期还会继续使用这个结果,一般都是用反序列化的对象。

RDD与dataset

  • RDD:
    优点:类型安全,面向对象。
    缺点:序列化和反序列化的性能开销大;GC的性能开销,频繁的创建和销毁对象, 势必会增加GC。
  • Dataset的特点:
    快:大多数场景下,性能优于RDD;Encoders优于Kryo或者Java序列化;避免不必要的格式转化。
    类型安全:类似于RDD,函数尽可能编译时安全。
    和RDD互相转化。

Spark SQL vs Hive

  • 区别:
    Spark SQL的执行引擎为Spark core,Hive默认执行引擎为MapReduce。
    Spark SQL的执行速度是Hive的10-100倍。
    Spark SQL不支持buckets(桶表),Hive支持。
  • 联系:
    Spark SQL依赖Hive的元数据。
    Spark SQL兼容绝大部分Hive的语法和函数。
    Spark SQL可以使用Hive的自定义函数。

Spark Streaming

Spark Streaming是Spark核心API的一个扩展,一个实时计算框架。具有可扩展性、高吞吐量、可容错性等特点。Spark Streaming 计算基于DStream,将流式计算分解成一系列短小的批处理作业。把输入数据以秒(毫秒)为单位切分,再定时提交这些切分后的数据。

Spark Streaming vs Storm

在这里插入图片描述
事实上,Spark Streaming绝对谈不上比Storm优秀。这两个框架在实时计算领域中,都很优秀,只是擅长的细分场景并不相同。Spark Streaming仅仅在吞吐量上比Storm要优秀。

  • 对于Storm来说:
  1. 建议在那种需要纯实时,不能忍受1秒以上延迟的场景下使用,比如实时金融系统,要求纯实时进行金融交易和分析。
  2. 如果对于实时计算的功能中,要求可靠的事务机制和可靠性机制,即数据的处理完全精准,一条也不能多,一条也不能少,也可以考虑使用Storm。
  3. 如果还需要针对高峰低峰时间段,动态调整实时计算程序的并行度,以最大限度利用集群资源(通常是在小型公司,集群资源紧张的情况),也可以考虑用Storm。
  4. 如果一个大数据应用系统,它就是纯粹的实时计算,不需要在中间执行SQL交互式查询、复杂的transformation算子等,那么用Storm是比较好的选择。
  • 对于Spark Streaming来说:
  1. 如果对上述适用于Storm的三点,一条都不满足的实时场景,即,不要求纯实时,不要求强大可靠的事务机制,不要求动态调整并行度,那么可以考虑使用Spark Streaming。
  2. 位于Spark生态技术栈中,因此Spark Streaming可以和Spark Core、Spark SQL无缝整合,也就意味着,我们可以对实时处理出来的中间数据,立即在程序中无缝进行延迟批处理、交互式查询等操作。这个特点大大增强了Spark Streaming的优势和功能。

Structured Streaming

Structured Streaming是构建在Spark SQL引擎上的流式数据处理引擎。可以像使用静态RDD数据那样编写流式计算过程。当流数据连续不断的产生时,Spark SQL将会增量的、持续不断的处理这些数据,并将结果更新到结果集中。Structured Streaming的核心是将流式的数据看成一张数据不断增加的数据库表,这种流式的数据处理模型类似于数据块处理模型,可以把静态数据库表的一些查询操作应用在流式计算中,Spark执行标准的SQL查询,从无边界表中获取数据。

Spark扩展

  1. hdfs上的一个大数据文件,被分成3个分区(3个datanode),在mapreduce中会分成3个map运行,由于spark中的RDD是可分区的分布式数据集,所以运行1个RDD。
  2. RDD运行时尽可能避免分区大于节点数。
  3. RDD的血统机制:当某分区的RDD挂了之后,可以通过查找该RDD的父RDD,在父RDD上运行计算。
  4. 一个应用对应多个job,一个job对应一个executor,一个executor可以对应多个task,建议一个executor对应一个task。
  5. 父RDD存放读取文件的方法和分区信息,子RDD存放父RDD的引用和血统机制用到的逻辑运算。
  6. 所有RDD用血统机制,同时引进内存存放机制,一个是cache机制,结果存放在内存;另一个是checkpoint机制,结果存放在本地。
<think>好的,用户现在想了解Spark理论知识,特别是架构原理与核心概念。首先,我需要回顾之前的对话,看看用户之前问了什么。之前用户询问了Spark的安装和使用,现在转向理论知识,说明他们已经完成了环境搭建,可能开始实际应用,想深入理解内部机制。 用户提供的引用内容中有四篇资料,涉及Spark的架构设计、核心组件、集群运行原理、RDDSpark Streaming等。需要整合这些信息,确保回答覆盖这些要点。 首先,架构原理部分应该包括Spark的核心组件,如Driver、Cluster Manager、Worker Node、Executor,以及它们之间的交互。根据引用[2]和[4],需要解释集群模的工作原理,特别是RDD的弹性、分布容错性。同时,引用[3]提到Spark Streaming的微批处理,可能也是架构的一部分。 核心概念方面,RDD是关键,需要详细说明其特性(弹性、分布容错),以及DAG和任务调度。引用[4]提到RDD的分区和容错机制,需要强调。另外,内存计算和惰性求值也是重要点,引用[1]可能涉及架构设计中的这些优化。 用户可能还希望了解Spark的生态系统,比如Spark SQL、Streaming等,这些在引用[3]中有提到。需要简要说明各组件的作用,展示Spark的统一堆栈优势。 需要确保回答结构清晰,分点阐述,使用用户提供的引用作为支持,例如在解释容错性时引用[4],在集群运行时引用[2]。同时,添加相关问题,帮助用户进一步学习,比如性能优化、与Hadoop对比、RDD操作等,这些问题要基于现有内容自然延伸。 最后,检查是否符合之前的格要求:使用中文,数学公正确,引用标注,相关问题部分。确保没有使用markdown,行内公用$...$,独立公用$$...$$,但当前回答中没有数学公,可能不需要,但需留意。确认引用标记正确,如[^1]、[^2]等,与实际引用对应。</think>### Spark 架构原理与核心概念 #### 一、Spark 架构设计 Spark 的架构基于**主从模型**,核心组件包括 **Driver**、**Cluster Manager**、**Worker Node** 和 **Executor**,共同实现分布计算任务的高效执行[^1][^2]。 1. **Driver(驱动程序)** - 负责解析用户程序,生成 **DAG(有向无环图)**,并将任务拆分为 **Stage** 和 **Task**。 - 通过 **Cluster Manager** 申请资源,并协调任务的调度与执行[^2]。 2. **Cluster Manager(集群管理器)** - 支持多种模:Standalone、YARN、Mesos、Kubernetes。 - 管理 Worker 节点的资源分配(如 CPU、内存)[^1]。 3. **Worker Node(工作节点)** - 运行 **Executor** 进程,负责执行具体的 Task。 - 每个节点可启动多个 Executor,通过多线程并行处理任务[^4]。 4. **Executor(执行器)** - 在 Worker 节点上运行,负责 Task 的执行与结果返回。 - 提供内存缓存机制,加速迭代计算(如机器学习算法)[^4]。 #### 二、核心原理与运行机制 1. **弹性分布数据集(RDD)** - **核心抽象**:RDDSpark 的基石,代表不可变、分区的数据集合,支持并行操作[^4]。 - **特性**: - **弹性(Resilient)**:数据可存储在内存或磁盘,故障时通过血缘(Lineage)自动恢复[^4]。 - **分布(Distributed)**:数据分区分布在多个节点,分区是并行计算的基本单位。 - **容错性(Fault-tolerant)**:通过记录数据生成的血缘关系(如 `map`、`filter` 操作),重新计算丢失的分区[^4]。 - **创建方**:从 HDFS 文件、本地集合或转换现有 RDD 生成。 2. **DAG 调度与任务执行** - **DAG 生成**:Driver 将用户操作(如 `map`、`reduce`)转换为 DAG,优化执行顺序(如合并窄依赖操作)[^1]。 - **Stage 划分**:根据 **Shuffle 操作**(宽依赖)将 DAG 划分为多个 Stage,每个 Stage 包含一组可并行执行的 Task[^2]。 - **任务调度**:Task 被分配到 Executor 执行,Executor 向 Driver 汇报状态和结果[^2]。 3. **内存计算与惰性求值** - **内存优先**:RDD 默认缓存于内存,减少磁盘 I/O,适合迭代计算(如 PageRank 算法)[^4]。 - **惰性执行**:Transformations(如 `map`、`filter`)不会立即计算,直到遇到 Action(如 `collect`、`count`)才触发任务执行[^1]。 #### 三、核心概念与扩展组件 1. **Spark 生态组件** - **Spark SQL**:基于 DataFrame 的结构化数据处理,支持 SQL 查询与优化。 - **Spark Streaming**:通过 **微批次(Micro-batch)** 处理实时数据流(如将流数据切分为小批次,按 RDD 处理)[^3]。 - **MLlib**:提供分布机器学习算法库(如分类、聚类)。 - **GraphX**:图计算框架,支持 PageRank 等算法。 2. **Shuffle 机制** - 宽依赖操作(如 `groupByKey`)触发 Shuffle,数据在节点间重新分区,可能成为性能瓶颈。 - 优化方法:减少 Shuffle 次数、使用 `reduceByKey` 替代 `groupByKey`[^2]。 #### 四、Spark 优势与适用场景 1. **优势** - 比 Hadoop MapReduce 快 10~100 倍(得益于内存计算和 DAG 优化)[^4]。 - 统一技术栈支持批处理、流处理、SQL 查询等。 2. **适用场景** - 迭代计算(如机器学习训练)、交互查询、实时流处理[^3][^4]。 ```python # 示例:RDD 的血缘关系与容错 data = sc.textFile("hdfs://data/log.txt") # 从 HDFS 创建 RDD filtered = data.filter(lambda line: "error" in line) # 转换操作(记录血缘) count = filtered.count() # Action 触发实际计算 # 若某个分区丢失,Spark 可根据血缘重新计算 ``` --- ### 相关问题 1. **Spark 如何通过 RDD 的血缘关系实现容错?** 2. **DAG 调度器在任务优化中起到什么作用?** 3. **Spark 与 Hadoop MapReduce 在架构设计上有哪些本质区别?** 4. **如何根据业务场景选择 Spark 的部署模(如 Standalone vs YARN)?** 5. **Spark 的 Shuffle 过程为何可能成为性能瓶颈?有哪些优化手段?** [^1]: RDD 的血缘关系和内存计算机制是其高效容错的核心。 [^2]: DAG 调度通过合并窄依赖操作减少任务阶段数。 [^3]: 微批处理使得 Spark Streaming 能复用批处理引擎的高效性。 [^4]: 分区的分布存储与并行计算是 Spark 处理海量数据的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值