RDD是一个弹性、可复原的分布式的数据集
RDD中装的数据是数据的描述信息,描述了从哪读数据,调用什么方法,传入什么函数,一级依赖关系等
RDD特点:
1.有一些连续的分区:分区编号从0开始,分区数量决定了Task的并行度(每一个分区中都有一个task,一个executor中可以有很多个tsak同时运行)
2.有一个函数作用在每个输入切片上(每一个要处理的文件从hdfs中传输过来足够大的时候是会出现很多物理切片的,都遵循同一个RDD或一系列依赖的RDD中储存的逻辑来进行分析)
3.RDD和RDD之间存在一些依赖关系,RDD调用transformation后生成一个新的RDD,字RDD会记录父RDD的依赖关系,包括窄依赖和宽依赖(窄依赖不会导致shuffle,宽依赖会导致shuffle)
4.KV的RDD在shuffle会有分区器,默认采用hashPartitioner
5.如果从HDFS中读取数据,会有一个最优位置:spark在调度任务之前会读取NameNode的元数据信息,获取数据的位置,移动计算而不是移动数据,这样可以提高计算效率。(有点不太理解)
一些个人理解:
窄依赖就好比 words.map((_, 1))
不需要shuffle
rdd在编程时候理解为mapreduce中的方法以及文件来自于哪
为什么说transformation是lazy状态 因为 我个人理解是说他需要先设定rdd中的方法然后包装好 生成task放入excutor执行,之所以说sortby不是lazy 可能是因为他是宽依赖 需要shuffle
所以 sortby 是不是会使driver生成新的task 而sortby之前的方法是不是都在一个task里
触发一次action 是一个job
触发一次shuffle 是一个stage
reduce算不算触发action
不算
如果是前后调用了reduce 和 sortby 为什么只生成了两个stage
生成了三个stage
所以说 sortby是不是就是生成了一个stage
是
stage中有多个task是指相同的类型的task 还是不同方法的task
从hdfs中读数据 有多少个数据切片 就有多少个分区
如果是一个文件夹里有n个文件 并且文件都是小于128 就是有n个切片 但不一定是n个分区 一个文件过大于其他文件 默认可以拥有两个分区两个task 可以在textFile方法中设置textFile("hdfs://linux01:9000/data",3) 后面的参数是规定较大文件会得到几个task
一个task中可能会有很多个rdd
rdd就是一个抽象的集合 但是rdd里面装的就是数据是从哪来的信息
task读文件时生成一个迭代器 但是比如说将读出的string 转换成 int int 的 rdd 是不是迭代器 还是相当于整个task就是一个迭代器
分布迭代 一层一层的迭代器
写入hdfs为啥要是kv形式(nullwritable,Text)
mapreduce的迭代器
map为啥叫做映射
rdd每一个分区对应一个task 每一个task对应一个迭代器
compute
和filter 之间的联系是啥
将task扔入executor中就会调用compute方法
每一个transformation都先检查闭包