
Spark中算子简介
Transformations算子
Transformations类算子是一类算子(函数)叫做转换算子,如map,flatMap,reduceByKey等,是延迟执行,也叫懒加载执行
- filter,过滤符合条件的记录数,true保留,false过滤掉
- map,将一个RDD中的每个数据项,通过map函数映射变为一个新的元素。特点:输入一条。输出一条数据
- flatMap,先map后flat,与map类似,每个输入项可以映射为0到多个输出项
- sample,随机抽样算子,根据传进去的小数按比例进行又放回或者无放回的抽样
- reduceByKey ,将相同的Key根据相应的逻辑进行处理
- sortByKey/sortBy,作用在K,V格式的RDD上,对key进行升序或者降序排序
- join/ leftOuterJoin/ rightOuterJoin/ fullouterjoin 作用在K,V格式的RDD上,根据K进行连接,对(K,V)join(K,W)返回(K,(V,W)),join后的分区数与父分区数多的那个相同
- union 合并两个数据集,数据集类型要一致,,返回新的RDD的分区是合并RDD分区数的总和
- intersection 取两个数据集的交集
- subtract 取两个数据集的差集
- mapPartition 与map类似,遍历的单位是每个partition上的数据
- distinct(底层是map+reduceByKey+map) 去重
- cogroup 当调用类型(K,V)和(K,W)的数据上时,返回一个数据集(K,(Iterable<V>,Iterable<W>))
- mapParttionWithIndex 类似于mapPartitions 除此之外还会携带分区的索引值
- repartition 增加或减少分区,会产生shuffle
- coalesce 常用来减少分区,第二个参数是减少分区过程中是否产生shuffle,true为产生shuffle,false不产生shuffle,默认是false。。如果coalesce设置的分区数比原来的RDD分区数还多的话,第二个参数设置为false不会起作用,如果设置成true,效果和repartition一样,即repartition(numPartitions)=coalesce(numPartitins,true)
- groupByKey 作用在K,V格式的RDD上,根据Key进行分组,作用在(K,V)返回(K,Iterable<V>)
- zip 将两个RDD中的元素(KV格式/非KV格式)变成一个KV格式的RDD,两个RDD个数必须相同
- zipWithIndex 该函数将RDD中的元素和这个元素在RDD中的索引号(从0开始)组合成(K,V)对
Action行动算子
Action类算子是触发执行,一个application应用程序中有几个action类算子执行,就有几个runjob运行
- count ,返回数据集中的元素数,会在结果计算完成后回收到Driver端
- take(n) ,返回一个包含数据集前n个元素的集合
- first first=take(1),返回数据集中的第一个元素
- foreach,循环遍历数据集中的每个元素
- collect,将计算结果回收到Driver端
- foreachPartition 遍历的数据是每个partition的数据
- countByValue 根据数据集每个元素相同的内容来计数,返回相同内容的元素对应的条数
- reduce 根据聚合逻辑,聚合数据集中的每个元素
控制算子(持久化算子)
三种控制算子,都可将RDD持久化,持久化的单位是partition,cache和persist都是懒执行,必须要有action算子出发执行,checkpoint算子不仅能将RDD持久化到磁盘上,还能切断RDD之间的依赖关系
- cache ,默认将RDD的数据持久化到内存中,底层是persist的stroagelevel. MEMORY_ONLY级别
- persist: 可以指定持久化的级别,最常用的是MEMORY_ONLY和MEMORY_AND_DISK,
*cache和persist的注意事项
A、 cache和persist都是懒执行,必须有一个action类算子触发执行
B、 cache和persist算子的返回值可以赋值给一个变量,在其他job中直接使用这个变量 就是使用持久化的数据量,持久化的单位是partition
C、 cache和persist算子后不能立即紧跟action算子
3. checkpoint:将RDD持久化到磁盘,还可以切断RDD之间的依赖关系
Checkpoint的执行原理
A. 当RDD的job执行完毕后,会从finalRDD从后往前回回溯
B. 当回溯到某一个RDD调用了checkpoint方法,会对当前的RDD做一个标记
C. Spark框架会自动启动一个新的job们重新计算这个RDD的数据,将数据持久化到HDFS上
优化:对RDD执行checkp之前,最好对这个RDD限制性cache,这样新启动的job只需要将内存中的数据拷贝到HDFS上就可以,省去了重新计算这一步