1、RDD是什么,RDD的五大属性
RDD是弹性分布式数据集
五大属性:
- 分区(指定数据是哪个分区的)
- 分区内的计算逻辑
- 分区器(如果有键值对可以控制分区的数据流向)
- 血缘关系
- 移动数据不如移动计算
2、RDD的弹性体现在哪里
存储弹性:内存磁盘一起用
计算弹性:重试机制
分片弹性:分区可以改变
容错弹性:可以基于血缘关系,也就是上一个RDD重新进行计算,恢复当前RDD的数据
3、Spark的算子
1、转换算子
1)单value (rdd2 = rdd1.算子)
- **map:**一次处理一条数据
- mappartitions:一次处理一个分区的数据(效率更高)
- flatmap:一进多出 groupby:分组
- **coalesce:**选择是否执行shuffle,一般用于缩小分区
- repartition:在coalesce基础上实现,选择是否执行shuffle,一般用于扩大分区
2) 双value( rdd3 = rdd1.算子(rdd2) )
- 交并差(intersection、union、subtract)、zip拉链
3)key-value
-
reduceByKey:有预聚合、重分区,聚合计算
-
groupByKey:没有预聚合,重分区但是不计算
2、行动算子
- Collect(把数据拉回driver端做展示)、foreach(一条一条的触发计算)
4、Spark中的血缘,以及宽窄依赖
血缘说的就是宽依赖和窄依赖。有shuffle的是宽依赖
宽依赖:父RDD 的一个分区的数据会被子 RDD 的多个分区依赖,涉及到 Shuffle
窄依赖:父RDD 的一个分区的数据只会被子 RDD 的一个分区依赖
窄依赖的多个分区可以并行计算;宽依赖必须等到上一阶段计算完成才能计算下一阶段
5、Spark的任务划分
1、一个sparkcontext,也就是main中的一个上下文,生成一个Application
2、一个行动算子生成一个job
3、stage等于宽依赖个数+1
4、Task,数量=最后一个RDD的分区数(即这个stage中经过一些列的rdd后最后生成的文件个数,看最后一个RDD输出多少个分区,一个分区一个文件,也就是一个task)
6、Spark为什么比MR快?
1、磁盘使用较少,排序少
MR过程中频繁的将数据写入到磁盘中,reduce阶段再从磁盘拉取数据,消耗大量时间。Spark不需要将计算的中间结果写入磁盘
2、使用spark DAG
减少了不必要的shuffle,对于mr来说下一个job依赖于上一个,但是每一个job又会落到磁盘,对于spark来说,每一个job结果都可以保存到内存中,供后续的job使用
7、Spark shuffle和Hadoop shuffle的区别
1、内存缓冲区
Mr是圆形缓冲区,spark不是
Mr的缓冲区是固定大小的,但是spark是动态扩容
2、排序
Hadoop的shuffle的必须排序的,map和reduce都要求分区内有序,但是spark不要求这一点
3、执行顺序
Hadoop不用等所有的maptask都执行完了才可以开启reducetask
Spark必须等父stage执行完才可以去抓取数据
8、除了RDD,你还了解Spark的其他数据结构吗
累加器和广播变量
- 累加器:
在driver端定义的变量在executor端的每个task都会得到这个变量的一份新的额副本,每个task更新这些副本的值后,传回driver端进行合并
- 广播变量:
广播变量就是分布式共享只读变量,简单说一下它的原理:用来高效分发较大的对象。向所有工作节点发送一个较大的只读值,以供一个或多个Spark操作使用
标签:总结,依赖,shuffle,分区,算子,RDD,必会,Spark From: https://blog.csdn.net/Mikkkee/article/details/137077809