1、加载主类,通过反射调用指定类的main方法;
2、创建SparkContext,与Master进行通信申请资源;
3、Master与Worker通信,启动executor;
4、Worker中启动executor,并创建线程池;
5、executor向Driver反向注册;
6、创建原始RDD;
val lines = sc.textFile(“hdfs://linux02:9000/data”)
7、调用RDD中的Transformation(s)算子;
val result = lines.filter(!.startsWith(“java”)).map(.toUpperCase())
8、调用RDD的Action算子saveAsTextFile(Action底层调用sc.runJob);
result.saveAsTextFile(“hdfs://linux02:9000/output”)
9、构建DAG,根据shuffle切分stage,生成taskSet;
task是类的实例,这个类是根据调用的RDD的方法传入的函数生成的(有属性:记录读取那个切片的数据;有方法:如何对数据进行运算)
10、TastScheduler将task序列化后,通过网络发送给executor;
11、executor接收task后,进行反序列化,然后用实现runnable接口的包装类包装这一层,最后提交到线程池中;
读数据是以迭代器的形式边读边计算的。