一.Spark中的算子总结(原理)
Spark算子
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).持久化算子。
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之间的依赖关系。
————————————————————————————————————————————————————————
二.算子实例
package com.bjsxt
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import scala.collection.mutable.ListBuffer
object Suanzi {
def main(args: Array[String]): Unit = {
val conf=new SparkConf().setAppName("test").setMaster("local");
val sc=new SparkContext(conf)
val rdd2=sc.parallelize(Array(
"love1","love2","love3","love4",
"love5","love6","love7","love8",
"love9","love10","love11","love12"
),3)