Spark RDD(弹性分布式数据集)

  • Spark RDD

    弹性分布式数据集
    弹性分布式数据集(RDD)是Spark的基本数据结构。它是对象的不可变分布式集合。RDD中的每个数据集都分为逻辑分区,可以在群集的不同节点上进行计算。RDD可以包含任何类型的PythonJavaScala对象,包括用户定义的类。
    形式上,RDD是记录的只读分区集合。可以通过对稳定存储上的数据或其他RDD进行确定性操作来创建RDD。RDD是可以并行操作的元素的容错集合。
    有两种创建RDD的方法
    • 并行化驱动程序中的现有集合
    • 引用外部存储系统(例如共享文件系统,HDFS,HBase或提供Hadoop输入格式的任何数据源)中的数据集。
    Spark利用RDD的概念来实现更快,更有效的MapReduce操作。让我们首先讨论MapReduce操作是如何发生的以及为什么它们效率不高。
  • MapReduce中的数据共享速度很慢

    MapReduce 被广泛采用,用于在集群上使用并行分布式算法来处理和生成大型数据集。它允许用户使用一组高级运算符来编写并行计算,而不必担心工作分配和容错性。
    不幸的是,在大多数当前框架中,在计算之间(两个MapReduce作业之间的Ex-)重用数据的唯一方法是将其写入外部稳定的存储系统(Ex HDFS)。尽管此框架提供了许多用于访问群集的计算资源的抽象,但用户仍然需要更多。
    这两个迭代互动应用需要更快速地并行作业的数据共享。由于复制,序列化和磁盘IO,MapReduce中的数据共享速度很慢。对于存储系统,大多数Hadoop应用程序花费90%以上的时间进行HDFS读写操作。
  • MapReduce上的迭代操作

    在多阶段应用程序中跨多个计算重用中间结果。下图说明了在MapReduce上进行迭代操作时当前框架的工作方式。由于数据复制,磁盘I/O和序列化,这会导致相当大的开销,这会使系统变慢。
    spark
  • MapReduce上的交互式操作

    用户对同一数据子集运行临时查询。每个查询都会在稳定存储上执行磁盘I/O,这可能会影响应用程序的执行时间。
    下图说明了在MapReduce上进行交互式查询时当前框架的工作方式。
    spark
  • 使用Spark RDD进行数据共享

    由于复制,序列化和磁盘IO,MapReduce中的数据共享速度很慢。在大多数Hadoop应用程序中,它们花费90%以上的时间进行HDFS读写操作。
    认识到此问题后,研究人员开发了一种称为Apache Spark的专门框架。Spark 的关键思想是- [Resilient Distributed Datasets(RDD)];它支持内存中处理计算。这意味着,它将内存状态存储为跨作业的对象,并且该对象可在这些作业之间共享。内存中的数据共享比网络和磁盘快10到100倍。
    现在让我们尝试找出在Spark RDD中如何进行迭代和交互操作。
  • Spark RDD上的迭代操作

    下图显示了Spark RDD上的迭代操作。它将中间结果存储在分布式内存中,而不是稳定存储(磁盘)中,并使系统运行更快。
    –如果分布式内存(RAM)不足以存储中间结果(JOB的状态),则它将这些结果存储在磁盘上。
    spark
  • Spark RDD上的交互式操作

    此图显示了在Spark RDD上的交互操作。如果对同一组数据重复执行不同的查询,则可以将这些特定数据保留在内存中,以缩短执行时间。
    spark
    默认情况下,每次在其上执行操作时,都可能会重新计算每个转换后的RDD。但是,您也可以将RDD保留在内存中,在这种情况下,Spark将在下次查询时将元素保留在群集中,以加快访问速度。还支持将RDD持久保存在磁盘上,或在多个节点之间复制。