2.7日结
这里的闭包指的是,当Executor在执行的过程中需要用到Driver内存里面的变量的话,就要求这个变量必须要先序列化,否则就会报错
这里即使集合里面没有数据,也会报错,因为在执行foreach之前会有一次检测,如果发现有scala对象未序列化,就报错,也就不会触发foreach方法
另外这里要明白为什么rdd里面的方法才叫算子,因为算子方法在executor端执行。
P92说明了RDD之间的依赖和血缘关系
窄依赖指下游rdd里面的数据只依赖于一个上游的rdd,宽依赖(shuffle)指的是上游的数据被多个下游的rdd所依赖。
如下有两张图,分别是宽依赖和窄依赖,宽依赖因为要经过shuffle,那么需要分阶段,我以WordCount为例,在进行reduceBYKey之前是一个阶段,然后聚合是另一个阶段(只有一个阶段结束之后才可以执行下一个阶段)
而窄依赖的话,本身不同任务之间不需要相互等待,异步执行完毕即可,所以窄依赖只需要两个Task任务,而涉及宽依赖的RDD中需要更多的Task.
cache持久化,不一定用于对象重用,也有可能在执行行动算子的时候数据执行较长或者比较重要的场合,也可以采用持久化的操作(默认是在内存)
学习完毕RDD,之后又了解到累加器