什么是火花中的RDD

时间:2015-12-23 10:01:15

标签: scala hadoop apache-spark rdd

定义说:

  

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

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

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

  

用户以两种方式创建RDD:通过加载外部数据集或通过   在其中分发对象的集合(例如,列表或集合)   司机程序

我很难理解RDD的一般情况以及与spark和hadoop的关系。

请有人帮忙。

9 个答案:

答案 0 :(得分:34)

RDD本质上是一组数据的Spark表示,分布在多台机器上,使用API​​让您对其进行操作。 RDD可以来自任何数据源,例如文本文件,通过JDBC的数据库等

正式定义是:

  

RDD是容错的并行数据结构,可以让用户使用   明确地将中间结果保存在内存中,控制它们   分区以优化数据放置,并使用a来操作它们   丰富的运营商。

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

答案 1 :(得分:13)

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

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

enter image description here

更新Here是描述RDD内部结构的文章:

希望这有帮助。

答案 2 :(得分:10)

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

RDD具有以下属性 -

  1. 不变性和分区:  RDD由分区的记录集合组成。分区是RDD中并行性的基本单元,每个分区是数据的一个逻辑分区,它是不可变的,并通过现有分区上的一些转换创建。可模糊性有助于实现计算的一致性。

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

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

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

  4. 例如 -

    firstRDD=sc.textFile("hdfs://...")
    
    secondRDD=firstRDD.filter(someFunction);
    
    thirdRDD = secondRDD.map(someFunction);
    
    result = thirdRDD.count()
    

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

    1. 懒惰评估: Spark首次在动作中使用它时会懒惰地计算RDD,以便它可以进行管道转换。因此,在上面的示例中,只有在调用count()动作时才会评估RDD。

    2. <强>持久性: 用户可以指出他们将重用哪些RDD并为他们选择存储策略(例如,内存存储或磁盘等)。

    3. RDD的这些属性使它们可用于快速计算。

答案 3 :(得分:7)

弹性分布式数据集(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建议的论文。

答案 4 :(得分:6)

RDD =弹性分布式数据集

弹性(字典含义)=(一种物质或物体)在弯曲,拉伸或压缩后能够反冲或弹回形状

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

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

给定的RDD(数据)可以跨越Spark集群中的各个节点(就像在基于Hadoop的集群中一样)。

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

答案 5 :(得分:2)

为了将RDD与scala集合进行比较,下面是一些差异

  1. 相同但在群集上运行
  2. 懒惰的scala集合严格
  3. RDD始终是不可变的,即您无法更改集合中的数据状态
  4. RDD是自恢复的,即容错的

答案 6 :(得分:0)

RDD R 弹性 D 已分配的 D 数据集)是表示数据的抽象。从形式上讲,它们是记录的只读分区集合,提供了便捷的API。

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

  • 数据保留在内存中以减少磁盘I / O;这对于迭代计算尤其重要-不必将中间数据持久化到磁盘
  • 容错(恢复力)不是通过复制数据而是通过跟踪应用于初始数据集的所有转换(谱系)来获得的。这样,在发生故障的情况下,始终可以从其沿袭中重新计算丢失的数据,避免再次进行数据复制可以减少存储开销
  • 惰性评估,即在需要时首先进行计算

RDD有两个主要限制:

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

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

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

RDD 是弹性分布式数据集。 这是火花的核心部分。 这是spark的低级API。 DataFrame和DataSet建立在RDD之上。 RDD只是行级数据,即位于n个执行程序上。 RDD是不可变的。意味着您不能更改RDD。但是您可以使用Transformation and Actions

创建新的RDD