codecamp

Apache Spark RDD

弹性分布式数据集

弹性分布式数据集(RDD)是Spark的基本数据结构。它是对象的不可变的分布式集合。在RDD每个数据集被划分成逻辑分区,这可能在集群的不同节点上进行计算。 RDDS可以包含任何类型的Python,Java的,或者Scala的对象,包括用户定义的类。

形式上,一个RDD是一个只读分区记录的集合。 RDDS可通过确定性行动上稳定存储或其他RDDS无论是数据被创建。 RDD是可以并行操作的元件的容错集合。

有两种方法可以创建RDDS -在你的驱动程序并行现有的集合,或引用在外部存储系统, 数据集如共享文件系统,HDFS,HBase的,或任何数据源提供Hadoop的输入格式。

Spark利用RDD的概念实现更快和有效的MapReduce操作。让我们先讨论如何MapReduce的操作发生,为什么不那么有效。

数据共享是MapReduce的慢

MapReduce的被广泛用于处理和并行产生大型数据集采用,在集群上的分布式算法。它允许用户编写并行计算,使用一组高层次的运营商,而不必担心工作分配和容错能力。

遗憾的是,目前大多数的框架,只有这样,才能重新使用计算(前 - 两个MapReduce任务之间)的数据是将其写入外部稳定的存储系统(例 - HDFS)。虽然这个框架提供了访问群集的计算资源众多抽象,用户还是想要更多。

这两个迭代交互式应用需要跨并行作业更快速的数据共享。数据共享是缓慢的MapReduce由于复制,序列化磁盘IO。关于存储系统,大部分的Hadoop应用,他们花费的时间的90%以上做HDFS读 - 写操作。

MapReduce的迭代操作

重用多级的应用程序在多个计算中间结果。下图说明了目前的框架是如何工作的,同时做MapReduce的迭代操作。这招致由于数据复制,磁盘I / O和系列化,使系统缓慢实质性开销。

MapReduce的迭代操作

MapReduce的交互式操作

用户运行即席查询对相同的数据子集。每个查询会做的稳定存储,它可以主宰应用程序执行时间的磁盘I / O。

下图说明了目前的框架,同时做交互查询MapReduce的工作方式。

MapReduce的交互式操作

使用SparkRDD数据共享

数据共享是缓慢的MapReduce由于复制,序列化磁盘IO。最Hadoop的应用,他们花费的时间的90%以上做HDFS读 - 写操作。

认识到这个问题,研究人员开发了一种称为Apache的Spark专门框架。Spark的关键思想为R esilientðistributedðatasets(RDD);它支持在内存中处理的计算。这意味着,它存储的存储器状态横跨的作业的对象和对象是那些作业之间共享。在存储器数据共享比网络和磁盘快10到100倍。

现在让我们尝试找出迭代和交互操作如何发生Spark中RDD。

在SparkRDD迭代操作

下面给出的图显示SparkRDD迭代操作。它将存储在分布式存储器代替稳定存储(磁盘)中间结果,使系统更快。

注意 -如果分布式存储器(RAM)不足以存储中间结果(作业状态),那么它会在磁盘上存储这些结果。

在SparkRDD迭代操作

在SparkRDD交互式操作

此图显示SparkRDD交互式操作。如果不同的查询在同一组数据的反复运行,该特定数据可被保存在内存中获得更好的执行时间。

在SparkRDD交互式操作

默认情况下,每个变换RDD可在每次运行在其上的动作时间重新计算。然而,你也可能会持续一个RDD在内存中,在这种情况下,Spark将保持元件周围的群集上更快地访问,查询它的下一次。此外,还为在磁盘上持续RDDS支持,或跨多个节点的复制。


Apache Spark 介绍
Apache 安装Spark
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

Apache Spark Useful Resources

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }