原文连接 http://xiguada.org/spark_rdd/
RDD(Resilient Distributed Datasets弹性分布式数据集),是spark中最重要的概念,可以简单的把RDD理解成一个提供了许多操作接口的数据集合,和一般数据集不同的是,其实际数据分布存储于一批机器中(内存或磁盘中)。当然,RDD肯定不会这么简单,它的功能还包括容错、集合内的数据可以并行处理等。图1是RDD类的视图。
图1
一个简单的例子
下面是一个实用scala语言编写的spark应用(摘自Apache Spark 社区https://spark.apache.org/docs/latest/quick-start.html)。
/* SimpleApp.scala */
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
object SimpleApp {
def main(args: Array[String]) {
val logFile = “YOUR_SPARK_HOME/README.md” // Should be some file on your system
val conf = new SparkConf().setAppName(“Simple Application”) //设置程序名字
val sc = new SparkContext(conf)
val logData = sc.textFile(logFile, 2).cache() //加载文件为RDD,并缓存
val numAs = logData.filter(line => line.contains(“a”)).count()//包含a的行数
val numBs = logData.filter(line => line.contains(“b”)).count()//包含b的行数
println(“Lines with a: %s, Lines with b: %s”.format(numAs, numBs))
}
}
这个程序只是简单的对输入文件README.md包含’a‘和’b‘的行分别计数。当然如果你想运行这个程序,需要把YOUR_SPARK_HOME替换为Spark的安装目录。程序中定义了一个RDD:logData,并调用cache,把RDD数据缓存在内存中,这样能防止重复加载文件。filter是RDD提供的一种操作,它能过滤出符合条件的数据,count是RDD提供的另一个操作,它能返回RDD数据集中的记录条数。
RDD操作类型
上述例子介绍了两种RDD的操作:filter与count;事实上,RDD还提供了许多操作方法,如map,groupByKey,reduce等操作。RDD的操作类型分为两类,转换(transformations),它将根据原有的RDD创建一个新的RDD;行动(actions),对RDD操作后把结果返回给driver。例如,map是一个转换,它把数据集中的每个元素经过一个方法处理后返回一个新的RDD;而reduce则是一个action,它收集RDD的所有数据后经过一些方法的处理,最后把结果返回给driver。
RDD的所有转换操作都是lazy模式,即Spark不会立刻计算结果,而只是简单的记住所有对数据集的转换操作。这些转换只有遇到action操作的时候才会开始计算。这样的设计使得Spark更加的高效,例如,对一个输入数据做一次map操作后进行reduce操作,只有reduce的结果返回给driver,而不是把数据量更大的map操作后的数据集传递给driver。
下面分别是transformations和action类型的操作。
Transformations类型的操作
Action类型的操作
更多RDD的操作描述和编程方法请参考社区文档:https://spark.apache.org/docs/latest/programming-guide.html。
RDD底层实现原理
RDD是一个分布式数据集,顾名思义,其数据应该分部存储于多台机器上。事实上,每个RDD的数据都以Block的形式存储于多台机器上,下图是Spark的RDD存储架构图,其中每个Executor会启动一个BlockManagerSlave,并管理一部分Block;而Block的元数据由Driver节点的BlockManagerMaster保存。BlockManagerSlave生成Block后向BlockManagerMaster注册该Block,BlockManagerMaster管理RDD与Block的关系,当RDD不再需要存储的时候,将向BlockManagerSlave发送指令删除相应的Block。
图2 RDD存储原理
RDD cache的原理
RDD的转换过程中,并不是每个RDD都会存储,如果某个RDD会被重复使用,或者计算其代价很高,那么可以通过显示调用RDD提供的cache()方法,把该RDD存储下来。那RDD的cache是如何实现的呢?
RDD中提供的cache()方法只是简单的把该RDD放到cache列表中。当RDD的iterator被调用时,通过CacheManager把RDD计算出来,并存储到BlockManager中,下次获取该RDD的数据时便可直接通过CacheManager从BlockManager读出。
RDD dependency与DAG
RDD提供了许多转换操作,每个转换操作都会生成新的RDD,这是新的RDD便依赖于原有的RDD,这种RDD之间的依赖关系最终形成了DAG(Directed Acyclic Graph)。
RDD之间的依赖关系分为两种,分别是NarrowDependency与ShuffleDependency,其中ShuffleDependency为子RDD的每个Partition都依赖于父RDD的所有Partition,而NarrowDependency则只依赖一个或部分的Partition。下图的groupBy与join操作是ShuffleDependency,map和union是NarrowDependency。
图3 RDD dependency
RDD partitioner与并行度
每个RDD都有Partitioner属性,它决定了该RDD如何分区,当然Partition的个数还将决定每个Stage的Task个数。当前Spark需要应用设置Stage的并行Task个数(配置项为:spark.default.parallelism),在未设置的情况下,子RDD会根据父RDD的Partition决定,如map操作下子RDD的Partition与父Partition完全一致,Union操作时子RDD的Partition个数为父Partition个数之和。
如何设置spark.default.parallelism对用户是一个挑战,它会很大程度上决定Spark程序的性能。
相关推荐
spark原理与调优详解 Spark 是一种基于内存的分布式计算框架,旨在高效地处理大规模数据。下面是 Spark 的原理和调优详解。 Spark 背景和安装 Spark 的产生背景是为了解决传统 MapReduce 框架的不足之处,如计算...
**Spark运行原理详解** Spark作为一个高效的大数据处理框架,因其快速、通用且可扩展的特性,在大数据领域备受青睐。本文将深入探讨Spark的核心概念、架构设计以及执行过程,旨在帮助那些已经对Spark有一定基础理解...
与现有数据流系统相比,RDD特别适用于两种场景: 1. **迭代式算法**:这类算法在图应用和机器学习领域中十分常见。 2. **交互式数据挖掘工具**:此类工具通常涉及频繁的数据集查询。 对于这两种场景,将数据保持在...
Spark调度架构原理详解 Spark调度架构原理详解是Spark核心组件之一,对Spark的执行和调度至关重要。本文将从Spark调度架构原理的角度,深入探讨Spark的执行机制和调度原理。 Spark集群架构 Spark集群架构由三个...
#### 三、Spark运行原理详解 1. **RDD (Resilient Distributed Dataset)**:弹性分布式数据集,是Spark中最基本的数据抽象,具有容错性和不可变性。RDD通过一系列转换操作(如map、filter等)和动作操作(如count、...
3、课程引用: 经济学,地理学,城市规划与城市研究,公共政策与管理,社会学,商业与管理 ## 数据指标说明 断点回归分析被认为是最接近随机实验的检验方法,能够缓解参数估计的内生性问题,近来在越来越多的研究中...
的政策评估类方法有:断点回归(RDD)、传统双重差分法(DID)、倾向得分匹配双 重差分方法(PSM-DID)、合成控制法(SCM),各个方法之间各有优缺点相互补 充,目前,前三种方法很多了,而合成控制法(SCM)相对来...
### Spark作业调度详解 #### 一、Spark作业调度概述 在大数据处理领域,Apache Spark以其高效灵活的特点成为了处理大规模数据集的重要工具之一。Spark通过内存计算加速数据处理速度,并提供了丰富的API来支持多种...
Spark原理详解 Spark是一款分布式计算框架,由加州大学伯克利分校AMPLab开发,并于2010年开源。它的设计目标是提供一种快速、通用且可扩展的数据处理方案,适用于批处理、交互式查询、流处理和机器学习等多种工作...
Spark 核心原理详解 Spark 是一种基于内存的分布式计算框架,主要用于大规模数据处理和分析。下面是 Spark 核心原理的详细解释: 一、Spark 应用程序 Spark 应用程序是指用户编写的 Spark 应用程序/代码,包含了 ...
### Spark-Core核心机制详解 #### 一、Spark Core概述 Apache Spark是一款开源的大数据处理框架,它能够提供统一的数据处理接口,支持批处理、实时计算、机器学习等多种数据处理模式。Spark Core作为整个Spark框架...
最后,"第36讲-Spark核心编程:RDD持久化详解.zip"讲解了RDD的持久化机制。RDD持久化允许我们将中间结果缓存到内存或磁盘,以避免重复计算,提高整体性能。Spark支持多种持久化级别,如MEMORY_ONLY、MEMORY_AND_DISK...
### Spark Streaming 原理详解 #### 1. Spark Streaming 简介 ##### 1.1 概述 Spark Streaming 是 Apache Spark 生态系统中的一个重要组成部分,它为实时流数据处理提供了一套完整的解决方案。相比于传统的批处理...
以下是对Stata中断点回归设计的操作详解: 1. **断点回归设计原理**: 断点回归(Regression Discontinuity Design, RDD)是利用政策或其他干预在特定“断点”附近的连续性来估计其效应。当政策效应仅在阈值附近...
**Spark上的WordCount程序详解** ...通过这个简单的例子,我们可以深入理解Spark的工作原理,以及如何在Java环境中编写并执行Spark任务。在实际应用中,这些基本操作可以扩展到更复杂的分布式数据处理场景。
- **分区**:与父RDD相同。 - **依赖关系**:一对一依赖于父RDD。 - **计算函数**:计算父RDD并过滤结果。 - **位置信息**:由父RDD提供。 - **分区器**:无。 ##### 3. JoinedRDD - **分区**:基于reduce任务的...
- RDD内部工作原理 - 创建RDD的方法 - Schema的应用 - 从文件读取数据 - Lambda表达式的使用 - 全局与局部作用域的区别 - 转换操作详解(如.map(), .filter(), .flatMap(), .distinct(), .sample(), ....
MapPartitions算子与Map算子类似,但它是针对RDD中的每个分区进行操作的。这意味着传入的函数必须能够处理一个分区中的所有元素。MapPartitions算子对于需要在每个分区上执行特定操作的情况非常有用。 示例代码: ...
通过“Hadoop+Spark生态系统操作与实战指南.pdf”,你将能够深入理解这些技术的工作原理,学习如何部署、配置和优化Hadoop和Spark集群,以及如何在实际项目中应用它们。这份资料不仅涵盖了理论知识,还包含了丰富的...
#### 二、实验原理 随着互联网的发展,非结构化文本数据的增长速度非常快。为了有效处理这些数据,Spark提供了一种高效的数据处理方式。本次实验以统计莎士比亚作品中出现频率最高的单词为例,演示了如何使用Spark...