Spark的RDD详解(源码)
来源:互联网 发布:淘宝访客量和下单比例 编辑:程序博客网 时间:2024/06/05 09:33
RDD概论
具体概念百度(以下总结):
Spark中 RDD本身并不是数据,只是数据信息的集合。
getPartitions只运行一次;
compute每次有action算子的时候都会运行,一个partition一次。
NewHadoopRDD
Jobid
Partition
获取分区的方式,是根据inputFormatClass的反射获取inputFormat类来获取分区,获取split信息,然后new几个NewHadoopPartition(个数等于分区数)。一般自定义的Partition都没什么东西,都是一些partition的信息(例如数据的开始结束offset,主要是在获取数据时提供信息)
Compute (实际读取数据的方式)
读取数据使用compute方法(传入分区信息和task信息),返回一个Iterator。这里直接new一个Iterator,里面直接重写他的next等方法。(每次调用compute的时候,都会启动一个task任务)
获取分片的信息和对应分片的RecordReader(InputFormat里面的(写MR有时候要重写这个RecordReader))来读取数据,到这里已经把数据的读取都准备好了。
已经返回一个Iterator了。。调用Iterator的next就能得到这个分区的数据
RDD的依赖
刚开始生成RDD的时候会传入一个sc和一个seq[Dependencies](依赖关系),第二个一般为Nil(如果没有父依赖的话),可以查看HadoopRDD。
在自定义RDD时,如果是由parent(父依赖)生成的,需要传入一个父 RDD。分区信息可以使用parent的,数据的获取方式可以自己决定,在compute里。数据可以是从 parent.里面获取也可以自己重新载入(上图的例子中,将parent的对应的分区的数据进行data+”@”+x处理)。
参考:http://blog.sina.com.cn/s/blog_3eb4ed710102vzri.html
继承RDD有两种构造方法
无父依赖的RDD定义
比如生成HadoopRDD的时候就是继承的这个构造方法
Nil是依赖关系,初始为空。把下面这个图的extends RDD和上面的对应。可以发现,这个HadoopRDD继承自RDD(K,V)
有父依赖的RDD定义
比如使用map,filter等窄依赖的时候。其实内部也是调用的上面的方法,但是依赖使用了父RDD的
可以查看MapPartitionsRDD这个RDD。可以看到这个RDD是继承自RDDU跟上面的HadoopRDD不一样。其实是一样的。他调用的是上面这个图,最终继承的也是最上面的那个图
多父依赖的RDD定义
以下是join操作中生成的CoGroupedRDD的获取父依赖
- Spark的RDD详解(源码)
- Spark源码系列(二)RDD详解
- Spark源码系列(二)RDD详解
- Spark源码系列(二)RDD详解
- Spark源码系列(二)RDD详解
- Spark源码系列(二)RDD详解
- spark源码阅读笔记RDD(一)RDD的基本概念
- Spark源码系列(二)RDD详解 - 岑玉海
- spark RDD详解及源码分析
- spark RDD详解及源码分析
- spark源码阅读笔记RDD(三)RDD的缓存原理
- spark源码阅读笔记RDD(六) RDD的依赖关系
- spark源码阅读笔记RDD(七) RDD的创建、读取和保存
- 彻底详解Spark RDD 的的秘密花园(1)
- Spark源码分析(二)RDD
- Spark源码阅读(一)RDD
- spark源码之RDD(3)checkpoint
- Spark RDD 源码分析
- u3d做自己的第一个射击游戏demo,实现开火效果和跟随鼠标朝向
- QtCreator2.7.0桌面快捷方式创建过程
- Titanic: Machine Learning from Disaster
- framework学习之Qualcomm平台qcril初始化及消息处理流程
- raknet编译
- Spark的RDD详解(源码)
- Git 分布式版本控制系统
- 解说Zynq-7000 Uboot如何编译
- Qt Charts实践
- tomcat7.0.52及以上版本web.xml引用外部文件问题
- django 解决css,js文件304导致无法加载显示问题
- easyclient的get请求小问题
- https基础
- 九度OJ-1441:人见人爱 A^B(二分求幂)