1.什么是Spark?与MR的区别?
Spark是开源的通用的计算框架,目的是为了使数据分析更快。MR也是计算框架。
区别?
1).MR是基于磁盘迭代,Spark是基于内存迭代。
2).Spark中有DAG有向无环图。
3).MR中只有map,reduce两个类,相当于Spark中两个算子。Spark中有三类算子(转换算子,行动算子,持久化算子)。
4).MR是细粒度资源申请,Spark是粗粒度资源申请。
2.Spark运行模式?
1).Local:在eclipse/IDEA中编写代码,在本地运行
2).Standalone:Spark自带的资源调度框架,支持分布式搭建。
3).Yarn:Hadoop生态圈内的资源调度框架。
4).Mesos:资源调度框架。
3.Spark核心RDD
1).RDD(Resilient Distributed Dateset),弹性分布式数据集。Spark底层操作数据都是基于RDD。
2).RDD五大特性:
a).RDD由一系列Partition组成。
b).函数(算子)是作用在partition上的。
c).RDD之间有依赖关系。
d).分区器是作用在K,V格式的RDD上。
e).partition提供最佳计算位置,利于处理数据的本地化。符合“计算移动,数据不移动”
3).注意:
a).sc.textFile(...)读取HDFS中文件的方法,底层调用的是MR读取HDFS中文件的方法,首先会split,每个split大小默认
与一个block大小相同,每个split与RDD中的一个partition对应。
b).什么是K,V格式的RDD?
RDD中元素是一个个的tuple2 二元组,这个RDD就是K,V格式的RDD。
c).哪里体现了RDD的弹性(容错)?
i).RDD之间有依赖关系
ii).partition个数可多可少。
d).哪里体现了RDD的分布式?
partition是分布在多个节点上的。
4.Spark代码流程?
2.x之前 sparkContext是程序的入口
1).val conf = new SparkConf().setMaster(...).setAppName(...)
2).val sc = new SparkContext(conf)
3).创建RDD。
4).对RDD使用Transformation类算子进行数据转换。
5).使用Action类算子触发Transformation类算子执行。
6).sc.stop()
2.x之后 sparkSession是程序的入口,封装了sparkContext和SQLContext
1).val spark = SparkSession.builder().master(...).appname(...).getOrCreate()
2).创建RDD。
3).对RDD使用Transformation类算子进行数据转换。
4).使用Action类算子触发Transformation类算子执行。
5).sc.stop()
5.Spark算子
部分算子
对于Transformations返回值均为RDD,而Action返回值都不是RDD
1).Transformations ,转换算子,懒执行,需要Action类算子触发。
map/mapToPair,flatMap,filter,reduceByKey,sample,sortBy/sortByKey,groupByKey,join,leftOutJoin,rightOuterJoin,fullOuterJoin,distinct,union,intersection,subtract,repartition,coalesce,zip,zipWithIndex,mapPartitions,
mapPartitionWithIndex,cogroup,mapValues,aggreagateByKey,combineByKey
2).Action,行动算子,触发Action类算子执行。Spark应用程序中(Spark Application)有一个Action算子就有了一个job。
take,frist,foreach,count,collect,reduce,foreachPartition,countByKey,countByValue
3).持久化算子
cache和persist之后不能紧跟action算子,指的是 RDD.cache().action算子,这样是错误的
a).cache
默认将数据持久化到内存,cache()=persist()=persist(StorageLevel.MEMORY_ONLY)
b).persist
可以手动指定数据持久化级别。
MEMORY_ONLY
MEMORY_ONLY_SER
MEMORY_AND_DISK
MEMORY_AND_DISK_SER
"_2"代表有副本数,尽量避免使用"DISK_ONLY"级别。
c).checkpoint
将数据可以持久化到磁盘,指定的checkpoint目录中,切断checkpointRDD之前的依赖关系,使之后的RDD依赖于checkpoint目录中的数据。需要设置checkpoint路径。
RDD lineage 非常长,每一个RDD之间逻辑复杂,计算耗时。对一个RDD进行checkpoint之前最好先cache下。
注意:
a).cache和persist注意事项:
i).cache和persist是懒执行,需要Action算子触发。
ii).对一个RDD进行cache/persist之后,可以赋值给一个变量,下次直接使用这个变量就是使用的持久化的数据。
iii).cache/persist之后不能紧跟Action类算子。
b).checkpoint执行流程:
i).Spark任务执行完成之后,会从后往前回溯,找到CcheckpointRDD做标记。
ii).回溯完成之后,重新计算标记RDD的数据,将数据放入checkpoint目录中。
iii).切断RDD之间的依赖关系。