spark杂记-初识spark

1.rdd 弹性分布式数据集
分区;一个函数处理一个分区;sparkContext;

transformation(转换):延迟加载,算子中并不加载数据,如flatMap,map;
action(动作):真正开始计算数据 ,之前会记录转换rdd的路径,DAG,在执行action的时候会开始真正的计算,加载数据,这就是spark跟mr的区别,mr是分步骤处理数据,处理的中间结果是保存在磁盘中的,这就导致了多次读写磁盘,所以磁盘io是瓶颈,spark是记录运算的算子,在真正开始运算时,才一次导入数据,计算结果保存在内存中,计算完成后才导入hdfs中

wordcount:
sc.textFile(“c:\words.txt”).flatMap(.split(“”)).map((,1)).reduceByKey(+).sortBy(_._2,false).saveAsTextFile(“c:\wordcount”)

DAG:
spark将原始的rdd进行一系列的转换就会形成更DAG,根据RDD不同的依赖关系划分为不同的stage,对于窄依赖,partition的转换在stage中完成,对于宽依赖,由于中间有个shuffle的过程,所以子rdd需要等待父rdd全部完成后才能接下来的计算,因此宽依赖是划分stage的

sc.setCheckPointDir(“…………”)
rdd.checkpoint

血统lineage
容错性有两种策略,一种是记录操作日志(如hadoop的元数据保存,hbase的hlog),还有一种是设置数据检查点,数据计算很多的时候,会导致记录操作日志开销大,数据检查点的开销也很大,所以spark只支持粗粒度的记录,spark程序会记录一系列的rdd转化,类似于记录一种操作流水线叫lineage,当发生失败时,spark会根据他的依赖类型重新计算,窄依赖只需要重新计算父节点,宽依赖需要重新计算所有依赖父节点,两种场景下可以优化,选择设置数据检查点,一是rdd太长,二是出现宽依赖的地方来设置检查点,rdd.checkpoint(),sc.setCheckPointDir(“….”)用来备份计算数据的路径

cache()缓存

spark提交流程
1、客户端提交作业给Master
2、Master让一个Worker启动Driver,即SchedulerBackend。Worker创建一个DriverRunner线程,DriverRunner启动SchedulerBackend进程。
3、另外Master还会让其余Worker启动Exeuctor,即ExecutorBackend。Worker创建一个ExecutorRunner线程,ExecutorRunner会启动ExecutorBackend进程。
4、ExecutorBackend启动后会向Driver的SchedulerBackend注册。SchedulerBackend进程中包含DAGScheduler,它会根据用户程序,生成执行计划,并调度执行。根据依赖切分stage,对于每个stage的task,都会被存放到TaskScheduler中,ExecutorBackend向SchedulerBackend汇报的时候把TaskScheduler中的task调度到ExecutorBackend执行。
5、所有stage都完成后作业结束。

猜你喜欢

转载自blog.csdn.net/java_soldier/article/details/80395371