什么是RDD

RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象(其实是计算抽象)。代码中是一个抽象类,它代表一个不可变、可分区、里面的元素可并行计算的集合。

不可变:数据一旦写入,不可更改;联想到java 中的String类型,执行replace方法,它会返回一个新的字符串,但是原来的字符串不发生变化。RDD也是类似的;

可分区:每个RDD拥有多个分区(Partition),数据在多个分区同时计算。

RDD的属性

1)     一组分区(Partition),分区是数据集的基本组成单位;

2)     对每个分区数据进行处理的函数;

3)     RDD与RDD之间的依赖关系;

4)     一个Partitioner,即RDD的分区函数,决定分区的形成;

5)     一个列表,存储 存取每个Partition的优先位置(preferred location),就是距离原则,即哪个partition应该被调用

RDD特点

1)分区

RDD逻辑上是分区的,每个分区的数据是抽象存在的,计算的时候会通过一个compute函数得到每个分区的数据。如果RDD是通过已有的文件系统构建,则compute函数是读取指定文件系统中的数据,如果RDD是通过其他RDD转换而来,则compute函数是执行转换逻辑将其他RDD的数据进行转换。

2)只读

如下图所示,RDD是只读的,要想改变RDD中的数据,只能在现有的RDD基础上创建新的RDD。

由一个RDD转换到另一个RDD,可以通过丰富的操作算子实现,不再像MapReduce那样只能写map和reduce了,如下图所示。

RDD的操作算子包括两类,一类叫做transformations,它是用来将RDD进行转化,构建RDD的血缘关系;另一类叫做actions,它是用来触发RDD的计算,得到RDD的相关计算结果或者将RDD保存的文件系统中。

3)   依赖

RDDs通过操作算子进行转换,转换得到的新RDD包含了从其他RDDs衍生所必需的信息,RDDs之间维护着这种血缘关系,也称之为依赖。如下图所示,依赖包括两种,一种是窄依赖,RDDs之间分区是一一对应的,另一种是宽依赖,下游RDD的每个分区与上游RDD(也称之为父RDD)的每个分区都有关,是多对多的关系。

4)缓存

如果在应用程序中多次使用同一个RDD,可以将该RDD缓存起来,该RDD只有在第一次计算的时候会根据血缘关系得到分区的数据,在后续其他地方用到该RDD的时候,会直接从缓存处取而不用再根据血缘关系计算,这样就加速后期的重用。如下图所示,RDD-1经过一系列的转换后得到RDD-n并保存到hdfs,RDD-1在这一过程中会有个中间结果,如果将其缓存到内存,那么在随后的RDD-1转换到RDD-m这一过程中,就不会计算其之前的RDD-0了。

5)checkpoint

虽然RDD的血缘关系天然地可以实现容错,当RDD的某个分区数据失败或丢失,可以通过血缘关系重建。但是对于长时间迭代型应用来说,随着迭代的进行,RDDs之间的血缘关系会越来越长,一旦在后续迭代过程中出错,则需要通过非常长的血缘关系去重建,势必影响性能。为此,RDD支持checkpoint将数据保存到持久化的存储中,这样就可以切断之前的血缘关系,因为checkpoint后的RDD不需要知道它的父RDDs了,它可以从checkpoint处拿到数据。

编程模型

在Spark中,RDD被表示为对象,通过对象上的方法调用来对RDD进行转换。经过一系列的transformations定义RDD之后,就可以调用actions触发RDD的计算,action可以是向应用程序返回结果(count, collect等),或者是向存储系统保存数据(saveAsTextFile等)。在Spark中,只有遇到action,才会执行RDD的计算(即延迟计算),这样在运行时可以通过管道的方式传输多个转换。

要使用Spark,开发者需要编写一个Driver程序,它被提交到集群以调度运行Worker,如下图所示。Driver中定义了一个或多个RDD,并调用RDD上的action,Worker则执行RDD分区计算任务。

 

最新文章

  1. 高性能的关键:Spring MVC的异步模式
  2. Atitit 编程语言编程方法的进化演进 sp  COP ,AOP ,SOP
  3. DDD 领域驱动设计-领域模型中的用户设计
  4. Android study first ----------安卓项目目录结构及adb指令
  5. 【jqGrid for ASP.NET MVC Documentation】.学习笔记.3.本地化语言包
  6. hdu 2087-剪花布条(KMP)
  7. GO的数组及切片
  8. IOS开发创建开发证书及发布App应用(六)——打包应用
  9. DOUAudioStreamer 中的DOUAudioFileProvider理解笔记
  10. Android 之xml解析
  11. Mysql数据库引擎介绍--转载
  12. 全国人口 信息(NCIIC)接口开发纪要
  13. day2_抓包_python基础
  14. es6 属性及常用新属性汇总
  15. webdriver 启动chrome时加载配置
  16. Linux 配置mail发送邮件
  17. 初学Struts2
  18. 721. Accounts Merge合并电子邮件账户
  19. linux克隆后修配置
  20. lintcode-186-最多有多少个点在一条直线上

热门文章

  1. Uber推出全新交通估算体系能颠覆传统模式吗?
  2. Linux环境创建交换分区
  3. C++基础--重载、重写、隐藏
  4. CSS padidng-top\margin-top\fixed 的特殊性
  5. LeetCode 687. Longest Univalue Path 最长同值路径 (C++/Java)
  6. CodeForces 51C 二分搜索
  7. mysql的常见面试问题
  8. Linux(CENTOS7) Nginx安装
  9. OpenCV和Qt的图像格式互转
  10. ModernCNN