Spark 介绍

本文介绍了Spark中的基本概念,包括RDD(弹性分布式数据集)的特性,如分布式、不可变性和容错性。RDD支持转化和行动操作,转化操作是惰性求值的,而行动操作会触发实际计算。此外,文章还详细解释了Spark的DAG划分,DAG由Job、Stage和Task组成,Job因Action操作触发,Stage依据Shuffle进行划分,Task负责处理Stage中的数据分区。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. spark RDD介绍

RDD:弹性分布式数据集(Resilient Distributed Dataset)。RDD是Spark的最基本抽象,是对分布式内存的抽象使用,实现了以操作本地集合的方式来操作分布式数据集的抽象实现。RDD是Spark最核心的东西,它表示已被分区,不可变的并能够被并行操作的数据集合,不同的数据集格式对应不同的RDD实现。RDD必须是可序列化的。RDD可以cache到内存中,每次对RDD数据集的操作之后的结果,都可以存放到内存中,下一个操作可以直接从内存中输入,省去了MapReduce大量的磁盘IO操作。这对于迭代运算比较常见的机器学习算法, 交互式数据挖掘来说,效率提升比较大。

弹性:指的是容错的能力,引擎会根据rdd之间的上下游关系、以及不同分片的数据来源,如果一部分分片或者rdd失败了,会根据血缘关系来重算。

分布式:一个rdd是有多个partition的,是为了进行分布式的并行计算。

在 Spark 中,对数据的所有操作不外乎创建 RDD、转化已有 RDD 以及调用 RDD 操作进行求值。而在这一切背后,Spark 会自动将RDD 中的数据分发到集群上,并将操作并行化执行。Spark 中的 RDD 就是一个不可变的分布式对象集合。每个 RDD 都被分为多个分区,这些分区运行在集群中的不同节点上。RDD 可以包含 Python、Java、Scala 中任意类型的对象,甚至可以包含用户自定义的对象。

RDD 支持两种操作:转化操作 Transformation 和行动操作 Action 。RDD 的转化操作是返回一个新的 RDD 的操作,比如 map() 和 filter(),比如常见map、flatmap、union、filter,另外通过key进行操作,reduceBykey、groupByKey、distinct、join,而行动操作则是向驱动器程序返回结果或把结果写入外部系统的操作,会触发实际的计算,比如 count() 和 first()、collect、take、foreach。Spark 对待转化操作和行动操作的方式很不一样,因此理解你正在进行的操作的类型是很重要的。如果对于一个特定的函数是属于转化操作还是行动操作感到困惑,你可以看看它的返回值类型:转化操作返回的是 RDD,而行动操作返回的是其他的数据类型。

RDD 的转化操作是返回新 RDD 的操作。转化出来的 RDD 是惰性求值的,只有在行动操作中用到这些 RDD 时才会被计算。许多转化操作都是针对各个元素的,也就是说,这些转化操作每次只会操作 RDD 中的一个元素。不过并不是所有的转化操作都是这样的。Spark 会在内部记录下所要求执行的操作的相关信息。我们不应该把 RDD 看作存放着特定数据的数据集,而最好把每个 RDD 当作我们通过转化操作构建出来的、记录如何计算数据的指令列表。把数据读取到 RDD 的操作也同样是惰性的。因此,当我们调用sc.textFile() 时,数据并没有读取进来,而是在必要时才会读取。和转化操作一样的是,读取数据的操作也有可能会多次执行。

2.Spark--DAG划分

DAG:有向无环图,分为三个层次,Job、stage、Task

  1. Job :遇到RDD的action操作,比如count(),就会从RDD的最后往前回溯,生成一个有向无环图。实际上是RDD的生产->转换->返回结果的过程。job里面分为Stage
  2. Stage:根据Shuffle来划分,确定是否在一个节点传数据。遇到shuffle,则将shuffle之前的窄依赖归来一个stage;
    1. 宽依赖(有shuffle):groupByKey、join等 (有在不同物理节点之间chua)
    2. 窄依赖(无shuffle):map、filter
  3. task:一个Stage里计算RDD一个partition的数据

1.先由sparkcontext初始化,创建一个DAGshcheduler,启动一个监听器,监听spark任务,spark拆分的所有任务都会发给这个监听器;

 2.客户端这边,当我们调用action时,则action会向sparkcontext启动一个runjob,即是将action任务(一个job)提交给DAGshcheduler的监听器;

3.接到job的DAGscheduler 会将任务交给handleJobSubmitted 来处理;

4. 每个job会生成一个resultstage,其余的都是shufflestage,shufflestage是根据rdd的宽依赖来生成的,根据广度优先遍历rdd,遇到shufflestage就创建一个新的stage;

5.形成DAG图之后,遍历执行stage列表,根据父子stage顺序执行,如果上层未执行完,下层会一直等待;

6.每个stage会拆分成多个task,交由taskshcheduler来分配,等待executor来执行完一个task后交给下一个task;

DAG源码解析:

https://www.cnblogs.com/yankang/p/9769720.html

https://www.cnblogs.com/yankang/p/9771778.html

### Apache Spark简介 Apache Spark 是一个开源的分布式计算系统,旨在提供数据处理的高速度和通用性[^2]。该平台不仅能够处理大规模的数据集,还具备实时数据分析的能力。通过使用最前沿的有向无环图(DAG)调度程序、查询优化器以及物理执行引擎,Spark实现了对于批处理数据和流数据处理性能的高度提升[^4]。 #### 基本概念 - **弹性分布式数据集(RDD)**:这是Spark最早引入的一种抽象表示形式,代表不可变且分区化的集合对象,在集群上并行操作。 - **DataFrame**:一种组织成命名列的数据结构,类似于关系数据库中的表或Pandas库里的DataFrame。它允许开发者以更直观的方式对大型数据集进行转换和聚合操作,并能自动优化内部执行计划[^5]。 - **Dataset**:结合了RDD的强大特性和DataFrame易于使用的API优势,既提供了编译期类型安全又保持了运行效率。 - **Transformation与Action**:Transformations定义了一系列懒加载的操作序列来构建新的RDD/Dataset/DataFrame;而Actions则触发实际计算并将结果返回给驱动程序或者保存到外部存储系统中。 ### 应用场景 由于其强大的功能特性,Apache Spark广泛应用于多个领域: - **机器学习模型训练**:借助MLlib组件提供的各种算法实现快速迭代开发复杂预测模型。 - **日志分析/ETL流程自动化**:可用于清洗整理海量的日志文件,从中提取有价值的信息用于业务决策支持。 - **实时推荐系统建设**:利用Structured Streaming模块实现实时事件流处理,及时响应用户行为变化调整个性化建议列表。 - **图形计算任务加速**:GraphX扩展包使得在超大社交网络或其他关联型数据集中查找路径变得简单高效。 ```python from pyspark.sql import SparkSession spark = SparkSession.builder.appName("example").getOrCreate() data = [("James", "", "Smith", "36636", "M", 3000), ("Michael", "Rose", "", "40288", "M", 4000)] columns = ["firstname", "middlename", "lastname", "id", "gender", "salary"] df = spark.createDataFrame(data, columns) df.show() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值