什么是 Spark RDD ?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是 Spark RDD ?相关的知识,希望对你有一定的参考价值。

参考技术A

RDD 是一个弹性的分布式的数据集,是 Spark 中最基础的抽象。它表示了一个可以并行操作的、不可变得、被分区了的元素集合。用户不需要关心底层复杂的抽象处理,直接使用方便的算子处理和计算就可以了。

RDD 示意图:

默认情况下,一个 HDFS 上的数据分片就是一个 partiton,RDD 分片数决定了并行计算的力度,可以在创建 RDD 时指定 RDD 分片个数,如果不指定分区数量,当 RDD 从集合创建时,则默认分区数量为该程序所分配到的资源的 CPU 核数 (每个 Core 可以承载 2~4 个 partition),如果是从 HDFS 文件创建,默认为文件的 Block 数。

有一点非常重要,就是由于 RDD 有前后依赖关系,遇到宽依赖关系,如 reduce By Key 等这些操作时划分成 Stage, Stage 内部的操作都是通过 Pipeline 进行的,在具体处理数据时它会通过 Blockmanager 来获取相关的数据,因为具体的 split 要从外界读数据,也要把具体的计算结果写入外界,所以用了一个管理器,具体的 split 都会映射成 BlockManager 的 Block,而体的 splt 会被函数处理,函数处理的具体形式是以任务的形式进行的。

并行集合的方式:

引用外部存储系统的数据集 (text、HDFS、Hbase 等):

最简单的理解就是在 RDD 的算子中使用了外部 (Driver 端) 定义的变量。

RDD 每经过一次转换操作都会生成一个新的 RDD,它们之间存在着依赖关系,这种依赖关系被划分成了两种,即 窄依赖 宽依赖

宽窄依赖示意图

当 RDD 触发了 action 算子之后,DAGScheduler 会开始分析最终 RDD 形成的依赖关系,逆向往前推导,前一个 RDD 被看做是父 RDD。每当遇到一个 宽依赖 的时候,便会以此为分界线,划分出一个 Stage。

stage 划分

当一个 RDD 需要被重复使用时,或者当任务失败重新计算的时候,这时如果将 RDD 缓存起来,就可以避免重新计算,保证程序运行的性能。

其实 cache 底层实际调用的就是 persist 方法,只是缓存的级别默认是 MEMORY_ONLY,而 persist 方法可以指定其他的缓存级别。

persist 也可以选择将数据缓存到磁盘当中,但是它交给 blockManager 管理的,一旦程序运行结束,blockManager 也会被停止,这时候缓存的数据就会被释放掉。而 checkPoint 持久化的数据并不会被释放,是一直存在的,可以被其它的程序所使用。

What is RDD ?

RDD is the spark\'s core abstraction which is resilient distributed dataset.

It is the immutable distributed collection of objects.

RDD Creation

RDD vs Dataframe vs Dataset

spark中的RDD是啥

【中文标题】spark中的RDD是啥【英文标题】:What is RDD in sparkspark中的RDD是什么 【发布时间】:2016-03-29 17:34:06 【问题描述】:

定义说:

RDD 是不可变的分布式对象集合

我不太明白这是什么意思。是不是像存储在硬盘上的数据(分区对象)如果是这样,那么RDD怎么会有用户定义的类(例如java,scala或python)

来自这个链接:https://www.safaribooksonline.com/library/view/learning-spark/9781449359034/ch03.html 它提到:

用户通过两种方式创建 RDD:通过加载外部数据集,或通过 将对象的集合(例如,列表或集合)分布在它们的 驱动程序

对于一般的 RDD 以及与 spark 和 hadoop 的关系,我真的很困惑。

有人可以帮忙吗?

【问题讨论】:

【参考方案1】:

本质上,RDD 是一组数据的 Spark 表示,分布在多台机器上,并带有 API 让您可以对其采取行动。 RDD 可以来自任何数据源,例如文本文件,通过 JDBC 的数据库等。

正式定义是:

RDD 是容错的并行数据结构,允许用户 显式地将中间结果保存在内存中,控制它们的 分区以优化数据放置,并使用 丰富的运算符集。

如果您想详细了解 RDD 是什么,请阅读其中一篇核心 Spark 学术论文,Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing

【讨论】:

当数据已经分布在RDD中时。分区是什么意思?其中distributed也可以表示partitioned? @kittu 数据是按分区分布的,你应该审核这门课程Introduction to Big Data with Apache Spark,还有一个更直观的方法来实现数据如何分区是使用@的方法glom 987654325@ 我认为更正确的说法是 RDD 是 DAG 的表示,该指令告诉如何检索数据以及如何处理它。 RDD 是数据的“惰性”表示。类似于sql执行计划。【参考方案2】:

RDDdataset 的逻辑引用,它在集群中的许多服务器机器上进行了分区。 RDD是不可变的,并且在发生故障时可以自我恢复。

dataset 可能是用户从外部加载的数据。它可以是 json 文件、csv 文件或没有特定数据结构的文本文件。

更新:Here 是描述 RDD 内部的论文:

希望这会有所帮助。

【讨论】:

@tharindu_DG 我没有得到 with no data ordering 部分。 RDD 和数据集通常可能严重依赖元素顺序。 @Odomontois:我想说一下数据结构。 CSV 是半结构化的,普通文本文件不是结构化的。我更正了答案对不起我的英语并感谢您指出。 @kittu:根据我的经验,你不需要了解 RDD 的全部知识来学习 spark。足以了解 RDD 的基本特性。当你用 spark API 做一些实现时,你就会明白了。 @tharindu_DG 谢谢,这就是我要找的。我需要基本的了解,这样我才能弄脏我的手。所以一个快速的问题,即 spark+cassandra 是正确的数据分析,所以这意味着我可以用它构建图形/图表?还是我想错了方向? @kittu:是​​的。 spark 支持多种数据输入源。 Cassandra 就是这样的来源之一。【参考方案3】:

形式上,RDD 是一个只读的、分区的记录集合。 RDD 只能通过对 (1) 稳定存储中的数据或 (2) 其他 RDD 的确定性操作来创建。

RDD 具有以下属性 –

    不变性和分区: RDD 由分区的记录集合组成。分区是RDD中并行的基本单位,每个分区是数据的一个逻辑划分,是不可变的,是通过对现有分区的一些变换而创建的。不可变性有助于实现计算的一致性。

    如果需要,用户可以根据他们想要加入多个数据集的键来定义自己的分区标准。

    粗粒度操作: 粗粒度操作是应用于数据集中所有元素的操作。例如 - 将在 RDD 分区中的所有元素上执行的 map、filter 或 groupBy 操作。

    容错: 由于 RDD 是通过一组转换创建的,因此它会记录这些转换,而不是实际数据。生成一个 RDD 的这些转换的图称为 Lineage Graph。

例如——

firstRDD=sc.textFile("hdfs://...")

secondRDD=firstRDD.filter(someFunction);

thirdRDD = secondRDD.map(someFunction);

result = thirdRDD.count()

如果我们丢失了 RDD 的某个分区,我们可以在 lineage 中重放该分区上的转换以实现相同的计算,而不是跨多个节点进行数据复制。这个特性是 RDD 的最大好处,因为它节省了一个在数据管理和复制方面付出了很多努力,从而实现了更快的计算。

    惰性评估: Spark 在第一次在动作中使用 RDD 时会延迟计算它们,以便它可以流水线化转换。因此,在上面的示例中,RDD 将仅在调用 count() 操作时进行评估。

    持久性: 用户可以指明他们将重用哪些 RDD,并为他们选择存储策略(例如,内存中存储或磁盘上等)

RDD 的这些属性使其可用于快速计算。

【讨论】:

【参考方案4】:

弹性分布式数据集 (RDD) 是 Spark 表示数据的方式。数据可以来自各种来源:

文本文件 CSV 文件 JSON 文件 数据库(通过 JBDC 驱动程序)

与 Spark 相关的 RDD

Spark 只是 RDD 的一个实现。

与 Hadoop 相关的 RDD

Hadoop 的强大之处在于它允许用户编写并行计算,而不必担心工作分配和容错。但是,对于重用中间结果的应用程序,Hadoop 效率低下。例如,迭代机器学习算法,如 PageRank、K-means 聚类和逻辑回归,重用中间结果。

RDD 允许将中间结果存储在 RAM 中。 Hadoop 必须将其写入外部稳定存储系统,从而生成磁盘 I/O 和序列化。使用 RDD,Spark 在迭代应用程序中的速度比 Hadoop 快 20 倍。

关于 Spark 的更多实现细节

粗粒度变换

应用于 RDD 的转换是粗粒度的。这意味着对 RDD 的操作适用于整个数据集,而不是其单个元素。因此,像 map、filter、group、reduce 这样的操作是允许的,但是像 set(i) 和 get(i) 这样的操作是不允许的。

粗粒度的逆是细粒度的。一个细粒度的存储系统将是一个数据库。

容错

RDD 具有容错性,这是一种使系统能够在其中一个组件发生故障时继续正常工作的属性。

Spark 的容错性与其粗粒度特性密切相关。在细粒度存储系统中实现容错的唯一方法是跨机器复制其数据或日志更新。然而,在像 Spark 这样的粗粒度系统中,只记录转换。如果 RDD 的某个分区丢失,RDD 有足够的信息可以快速重新计算。

数据存储

RDD 在分区中“分布”(分离)。每个分区可以存在于内存中或机器的磁盘上。当 Spark 想要在一个分区上启动一个任务时,他会将它发送到包含该分区的机器上。这称为“本地感知调度”。

来源: 关于 Spark 的优秀研究论文: http://spark.apache.org/research.html

包括 Ewan Leith 建议的论文。

【讨论】:

【参考方案5】:

RDD = 弹性分布式数据集

弹性(字典含义)=(物质或物体)在弯曲、拉伸或压缩后能够回弹或弹回原形

RDD 被定义为(来自 LearningSpark - OREILLY):始终重新计算 RDD 的能力实际上是 RDD 被称为“弹性”的原因。当保存 RDD 数据的机器出现故障时,Spark 会使用此功能重新计算丢失的分区,对用户透明。

这意味着“数据”肯定随时可用。此外,Spark 可以在没有 Hadoop 的情况下运行,因此不会复制数据。 Hadoop2.0 的最佳特性之一是在 Passive Standby Namenode 的帮助下实现“高可用性”。 Spark 中的 RDD 也是如此。

给定的 RDD(数据)可以跨越 Spark 集群中的不同节点(如基于 Hadoop 的集群)。

如果任何节点崩溃,Spark 可以重新计算 RDD 并将数据加载到其他节点,并且数据始终可用。 Spark 围绕弹性分布式数据集 (RDD) 的概念展开,它是一个容错的元素集合,可以并行操作 (http://spark.apache.org/docs/latest/programming-guide.html#resilient-distributed-datasets-rdds)

【讨论】:

【参考方案6】:

为了比较 RDD 和 scala 集合,下面是一些区别

    相同,但在集群上运行 Scala 集合严格的自然懒惰 RDD 始终是不可变的,也就是说,您无法更改集合中数据的状态 RDD 是自我恢复的,即容错

【讨论】:

我提到的是 scala 集合的默认性质,尽管我们可以通过指定惰性来使其变得惰性,lazy val l= List(10, 20); Stream 在这个意义上已经是懒惰的,例如,每个.view 在非常类似于RDD 意义上的懒惰【参考方案7】:

RDDR弹性D分布式Datasets)是表示数据的抽象。从形式上讲,它们是一个只读的、分区的记录集合,提供了一个方便的 API。

RDD 通过解决一些关键问题,为在 MapReduce 等集群计算框架上处理大型数据集提供了一种高性能解决方案:

数据保存在内存中以减少磁盘 I/O;这与迭代计算特别相关——不必将中间数据保存到磁盘 容错(弹性)不是通过复制数据获得的,而是通过跟踪应用于初始数据集(lineage)的所有转换来获得的。这样,万一发生故障,丢失的数据总是可以从其沿袭中重新计算,并且避免再次复制数据可以减少存储开销 惰性求值,即在需要时首先执行计算

RDD 有两个主要限制:

它们是不可变的(只读) 它们只允许粗粒度转换(即适用于整个数据集的操作)

RDD 的一个不错的概念优势是它们将数据和代码打包在一起,从而更容易重用数据管道。

来源:Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing、An Architecture for Fast and General Data Processing on Large Clusters

【讨论】:

【参考方案8】:

RDD是一种在spark中表示数据的方式。数据的来源可以是JSON、CSV文本文件或其他一些来源。 RDD 是容错的,这意味着它将数据存储在多个位置(即数据以分布式形式存储),因此如果节点发生故障,可以恢复数据。 在 RDD 中,数据随时可用。 然而,RDD 速度慢且难以编码,因此已经过时。 它已经被DataFrame和Dataset的概念所取代。

【讨论】:

【参考方案9】:

RDD 是一个弹性分布式数据集。 它是 spark 的核心部分。 它是 Spark 的低级 API。 DataFrame 和 DataSet 建立在 RDD 之上。 RDD 只不过是行级数据,即位于 n 个执行器上。 RDD 是不可变的。意味着您不能更改 RDD。但是你可以使用 Transformation 和 Actions 创建新的 RDD

【讨论】:

【参考方案10】:

弹性分布式数据集 (RDD)

弹性:如果在 spark 中的节点上执行操作时丢失,则可以从历史中重建数据集。

分布式:RDD 中的数据被划分为一个或多个分区,并作为内存中的对象集合分布在集群中的工作节点上。

数据集:RDD 是由记录组成的数据集,记录是数据集中唯一可识别的数据集合。

【讨论】:

以上是关于什么是 Spark RDD ?的主要内容,如果未能解决你的问题,请参考以下文章

大数据之Spark:Spark Core

如何查看spark中rdd的内容

我们什么时候应该使用Spark-sql,什么时候应该使用Spark RDD

spark 深入学习 03Spark RDD的蛮荒世界

spark RDD

Spark笔记:RDD基本操作(上)