spark中的rdd是什么

hyrbngr7  于 2021-05-29  发布在  Hadoop
关注(0)|答案(9)|浏览(827)

定义是:
rdd是不可变的分布式对象集合
我不太明白这是什么意思。它像存储在硬盘上的数据(分区对象)吗?如果是的话,那么rdd为什么可以有用户定义的类(比如java、scala或python)
通过此链接:https://www.safaribooksonline.com/library/view/learning-spark/9781449359034/ch03.html 它提到:
用户通过两种方式创建rdd:加载外部数据集,或在驱动程序中分发对象集合(例如列表或集合)
我对rdd的一般理解以及与spark和hadoop的关系感到困惑。
有人能帮忙吗。

clj7thdc

clj7thdc1#

rdd是一个有弹性的分布式数据集。它是spark的核心部分。它是spark的低级api。Dataframe和数据集构建在rdd之上。rdd只不过是行级数据,即位于n个执行器上。rdd是不可变的。意味着您不能更改rdd。但是您可以使用转换和操作创建新的rdd

gupuwyp2

gupuwyp22#

弹性分布式数据集(rdd)是spark表示数据的方式。数据可以来自不同的来源:
文本文件
csv文件
json文件
数据库(通过jbdc驱动程序)
与Spark有关的rdd
spark只是rdd的一个实现。
rdd与hadoop的关系
hadoop的强大之处在于它允许用户编写并行计算,而不必担心工作分配和容错性。然而,hadoop对于重用中间结果的应用程序来说效率很低。例如,迭代机器学习算法,如pagerank、k-means聚类和logistic回归,重用中间结果。
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建议的论文。

nfeuvbwi

nfeuvbwi3#

rdd是 dataset 在群集中的多台服务器上进行分区。RDD是不可变的,在发生故障时可以自我恢复。 dataset 可能是用户从外部加载的数据。它可以是json文件、csv文件或没有特定数据结构的文本文件。

更新:以下是描述rdd内部的文件:
希望这有帮助。

b1zrtrql

b1zrtrql4#

rdd(弹性分布式数据集)是表示数据的抽象。在形式上,它们是一个只读的、分区的记录集合,提供了一个方便的api。
rdd通过解决一些关键问题,为在诸如mapreduce之类的群集计算框架上处理大型数据集提供了一个高性能的解决方案:
数据保存在内存中以减少磁盘i/o;这与迭代计算特别相关——不必将中间数据持久化到磁盘
容错(弹性)不是通过复制数据来获得的,而是通过跟踪应用于初始数据集(谱系)的所有转换来获得的。这样,在发生故障的情况下,丢失的数据总是可以从其沿袭中重新计算,避免再次进行数据复制可以减少存储开销
惰性评估,即在需要时首先进行计算
rdd有两个主要限制:
它们是不可变的(只读)
它们只允许粗粒度转换(即应用于整个数据集的操作)
rdd的一个很好的概念优势是,它们将数据和代码打包在一起,从而更容易重用数据管道。
来源:弹性分布式数据集:内存集群计算的容错抽象,大型集群上快速通用数据处理的架构

50few1ms

50few1ms5#

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

sc4hvdpw

sc4hvdpw6#

rdd=弹性分布式数据集
有弹性的(字典的意思)=(指物质或物体)在弯曲、拉伸或压缩后能够反冲或弹回到原来的形状
rdd被定义为(从learningspark-oreilly):总是重新计算rdd的能力实际上是rdd被称为“弹性”的原因。当一台保存rdd数据的机器出现故障时,spark使用这种能力重新计算丢失的分区,对用户来说是透明的。
这意味着“数据”肯定随时可用。另外,spark可以在没有hadoop的情况下运行,因此数据不会被复制。hadoop2.0最好的特性之一是“高可用性”,借助于被动备用namenode。spark中的rdd也实现了这一点。
给定的rdd(数据)可以跨越spark集群中的各个节点(如基于hadoop的集群)。
如果任何节点崩溃,spark可以重新计算rdd并将数据加载到其他节点中,并且数据总是可用的。spark围绕着弹性分布式数据集(rdd)的概念展开,rdd是一个可以并行操作的元素的容错集合(http://spark.apache.org/docs/latest/programming-guide.html#resilient-分布式数据集(rdds)

6bc51xsx

6bc51xsx7#

为了比较rdd和scala集合,下面是一些区别
相同,但在群集上运行
在scala集合严格的情况下本质上是懒惰的
rdd总是不可变的,即不能更改集合中数据的状态
rdd是自恢复的,即容错的

ercv8c1e

ercv8c1e8#

形式上,rdd是一个只读的、分区的记录集合。RDD只能通过对(1)稳定存储中的数据或(2)其他RDD执行确定性操作来创建。
RDD具有以下属性-
不变性和分区:由分区的记录集合组成的RDD。分区是rdd中的基本并行单元,每个分区是一个数据逻辑分区,它是不可变的,是通过对现有分区进行一些转换而创建的。不可变有助于实现计算的一致性。
如果需要,用户可以根据想要连接多个数据集的键定义自己的分区标准。
粗粒度操作:粗粒度操作是应用于数据集中所有元素的操作。例如–将对rdd分区中的所有元素执行的map、filter或groupby操作。
容错:由于rdd是在一组转换上创建的,所以它记录这些转换,而不是实际的数据。这些转换生成一个rdd的图称为沿袭图。
例如–

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

secondRDD=firstRDD.filter(someFunction);

thirdRDD = secondRDD.map(someFunction);

result = thirdRDD.count()

如果我们丢失了rdd的某个分区,我们可以在沿袭中重放该分区上的转换以实现相同的计算,而不是跨多个节点进行数据复制。这是rdd的最大优点,因为它节省了大量的数据管理和复制工作,从而实现了更快的计算。
延迟计算:spark在第一次在操作中使用RDD时会延迟计算RDD,这样它就可以通过管道进行转换。因此,在上面的示例中,rdd将仅在调用count()操作时进行计算。
持久性:用户可以指出他们将重用哪些rdd,并为它们选择存储策略(例如,内存存储或磁盘存储等)
RDD的这些特性使得它们对于快速计算非常有用。

zengzsys

zengzsys9#

rdd本质上是一组数据的spark表示,分布在多台机器上,通过api可以对其进行操作。rdd可以来自任何数据源,例如文本文件、通过jdbc的数据库等。
正式定义为:
RDD是一种容错的并行数据结构,允许用户在内存中显式地持久化中间结果,控制其分区以优化数据放置,并使用一组丰富的操作符对其进行操作。
如果您想了解rdd的全部细节,请阅读spark的核心学术论文之一《弹性分布式数据集:内存集群计算的容错抽象》

相关问题