Spark 0.1是spark开源的第一个版本,本文主要从组成类、如何触发执行、如何具体执行这几个方面进行分析。
主要组成类:
1.RDD,其中RDD主要包含两种类型的函数,一种供用户使用的算子,如map、reduce等;一种是任务真正执行时需要的函数,如split、iterator等;
2.Scheduler,调度器用来提交、终止生成的task任务;
3.Task,具体任务的执行逻辑被封装到一个线程中,提交给Executor执行;
执行过程
举个简单的例子,其代码如下,然后我们对其执行逻辑进行分析,总结如下:生成RDD->行动操作触发RDD生成Tasks->通过scheduler提交Tasks给executor去真正执行;
val inputRDD = new HdfsTextFile("")
val res = inputRDD.map(f1).reduce(f2);
1.从hdfs获取外部输入时,生成inputRDD,此RDD包含了文件路径和sparkContext;
2.inputRDD调用map(f1)函数时,生成了MappedRDD,该rdd中包含前一个rdd,其splits为前一个rdd的splits;
3.mappedRDD调用reduce(f2)操作时,会先对func进行闭包清除,接着splits.map(s => new ReduceTask(this, s, f))生成tasks;其中splits递归调用最终返回的splits是inputRDD对应的splits,然后将此rdd、闭包函数和一个inputSplit封装成一个reduceTask;
4.封装的reduceTask其运行逻辑如下,rdd通过递归调用iterator(split)函数,最终inputRDD会先执行其map(f)函数,返回结果后回到上一层的子RDD中,子RDD再调用map(f)函数.......返回到当前RDD时获取了一个inputSplit的linear流水处理结果(针对每一行),即前面的map(f)操作都执行完了,最后根据func的逻辑对前面的结果进行reduce聚合,获取一个reduceTask的计算结果;
5.rdd的reduce函数中再对多个reduceTask的返回结果,根据func逻辑进行聚合,最后获取怎个rdd的reduce结果;
6.reduce()利用sparkContext、sparkContext再利用scheduler、scheduler最后利用executor来真正执行tasks;