程序员人生 网站导航

spark之RDD

栏目:服务器时间:2016-06-25 08:18:24
1、Spark中的RDD就是1个不可变的散布式对象集合。每一个RDD都被分为多个分区,这些分区运行在集群的不同节点上。创建RDD的方法有两种:1种是读取1个外部数据集;1种是在群东程序里分发驱动器程序中的对象集合,不如刚才的示例,读取文本文件作为1个字符串的RDD的示例。
2、创建出来后,RDD支持两种类型的操作:转化操作和行动操作
转化操作会由1个RDD生成1个新的RDD。(比如刚才的根据谓词挑选)
行动操作会对RDD计算出1个结果,并把结果返回到驱动器程序中,或把结果存储到外部存储系统(比如HDFS)中。比如first操作就是1个行动操作,会返回RDD的第1个元素。
注:转化操作与行动操作的区分在于Spark计算RDD的方式不同。虽然你可以在任什么时候候定义1个新的RDD,但Spark只会惰性计算这些RDD。它们只有第1个在1个行动操作中用到时,才会真实的计算。之所以这样设计,是由于比如刚才调用sc.textFile(...)时就把文件中的所有行都读取并存储起来,就会消耗很多存储空间,而我们马上又要挑选掉其中的很多数据。
这里还需要注意的1点是,spark会在你每次对它们进行行动操作时重新计算。如果想在多个行动操作中重用同1个RDD,那末可使用RDD.persist或RDD.collect让Spark把这个RDD缓存下来。(可以是内存,也能够是磁盘)

3、Spark会使用谱系图来记录这些不同RDD之间的依赖关系,Spark需要用这些信息来按需计算每一个RDD,也能够依托谱系图在持久化的RDD丢失部份数据时用来恢复所丢失的数据。(以下图,过滤errorsRDD与warningsRDD,终究调用union函数)



窄依赖 (narrowdependencies) 和宽依赖 (widedependencies) 。窄依赖是指 父 RDD 的每一个分区都只被子 RDD 的1个分区所使用 。相应的,那末宽依赖就是指父 RDD 的分区被多个子 RDD 的分区所依赖。例如, map 就是1种窄依赖,而 join 则会致使宽依赖
这类划分有两个用途。首先,窄依赖支持在1个结点上管道化履行。例如基于1对1的关系,可以在 filter 以后履行 map 。其次,窄依赖支持更高效的故障还原。由于对窄依赖,只有丢失的父 RDD 的分区需要重新计算。而对宽依赖,1个结点的故障可能致使来自所有父 RDD 的分区丢失,因此就需要完全重新履行。因此对宽依赖,Spark 会在持有各个父分区的结点上,将中间数据持久化来简化故障还原,就像 MapReduce 会持久化 map 的输出1样。


RDD工作原理:
RDD(Resilient DistributedDatasets)[1] ,弹性散布式数据集,是散布式内存的1个抽象概念,RDD提供了1种高度受限的同享内存模型,即RDD是只读的记录分区的集合,只能通过在其他RDD履行肯定的转换操作(如map、join和group by)而创建,但是这些限制使得实现容错的开消很低。对开发者而言,RDD可以看做是Spark的1个对象,它本身运行于内存中,如读文件是1个RDD,对文件计算是1个RDD,结果集也是1个RDD,不同的分片、数据之间的依赖、key-value类型的map数据都可以看作RDD。
主要分为3部份:创建RDD对象,DAG调度器创建履行计划,Task调度器分配任务并调度Worker开始运行。
SparkContext(RDD相干操作)→通过(提交作业)→(遍历RDD拆分stage→生成作业)DAGScheduler→通过(提交任务集)→任务调度管理(TaskScheduler)→通过(依照资源获得任务)→任务调度管理(TaskSetManager)
Transformation返回值还是1个RDD。它使用了链式调用的设计模式,对1个RDD进行计算后,变换成另外1个RDD,然后这个RDD又可以进行另外1次转换。这个进程是散布式的。
Action返回值不是1个RDD。它要末是1个Scala的普通集合,要末是1个值,要末是空,终究或返回到Driver程序,或把RDD写入到文件系统中
转换(Transformations)(如:map, filter, groupBy, join等),Transformations操作是Lazy的,也就是说从1个RDD转换生成另外一个RDD的操作不是马上履行,Spark在遇到Transformations操作时只会记录需要这样的操作,其实不会去履行,需要等到有Actions操作的时候才会真正启动计算进程进行计算。
操作(Actions)(如:count, collect, save等),Actions操作会返回结果或把RDD数据写到存储系统中。Actions是触发Spark启动计算的动因。
它们本质区分是:Transformation返回值还是1个RDD。它使用了链式调用的设计模式,对1个RDD进行计算后,变换成另外1个RDD,然后这个RDD又可以进行另外1次转换。这个进程是散布式的。Action返回值不是1个RDD。它要末是1个Scala的普通集合,要末是1个值,要末是空,终究或返回到Driver程序,或把RDD写入到文件系统中。关于这两个动作,在Spark开发指南中会有就进1步的详细介绍,它们是基于Spark开发的核心。


参考:http://www.itshipin.com/article/article110.html


------分隔线----------------------------
------分隔线----------------------------

最新技术推荐