action算子
会触发SparkContext提交Job作业,决定一个application中有多少个job
count:统计RDD共有多少行,并返回最终结果。
take(N):取出RDD的前N个元素
collect:回收算子,会将结果回收到Driver端,需要注意的是,数据量较大时,可能会在Driver端造成OOM。
foreach:遍历RDD中的每一个元素
saveAsTextFile:将DataSet中的元素以文本的形式写入本地或者HDFS系统中。
transaction算子
属于懒执行。
map:通过自定义的函数,映射转变为一个新的元素,作用域为RDD内所有元素。处理数据为一对一。
mapPartitions:通过函数获取到每个分区,并通过对分区内的所有元素进行操作。作用域为分区。相对于map,性能较高。
flatMap:通过自定义函数,可以将该RDD中一个集合中的元素打散,生成多个元素进行处理。处理数据为一对多。
filter:对元素经行过滤操作,对于满足函数要求的元素保留在RDD中,不满足的过滤掉。
sortBy:该函数实现依赖于sortByKey。相当于map+sortBykey
sortByKey:作用于<k, v>类型的RDD,并对k进行排序
reduceByKey:可以用于对RDD中的键值进行分组,会进行map端的聚合操作。对每个键的所有值进行归约操作,返回的是<k,reduce_v>类型的RDD。可以聚合每个分区相同键的键值对,减少了网络传输的数据量。
groupBy:按照指定规则,将数据分组。即相当于先进行了map操作,再根据key进行groupByKey操作
groupByKey:可以用于对RDD中的键值进行分组,但不会进行map端的聚合操作。其返回的是<k, Iterable<v>>类型的RDD,这种方式会导致在处理大量数据时,由于将相同的键的键值对放在同一分区,导致该分区的数据会很大,从而影响性能。
注:reduceByKey的性能比groupByKey高
join:会产生shuffle。按照相同的key生成新的RDD的分区数为大的RDD的分区数。类似于sql中的inner join
leftOuterJoin/rightOuterJoin/fullOuterJoin:类似于sql中的外连接。
union:类似于sql语句中的union all函数。需要保证两个RDD元素数据类型相同,不进行去重操作,保存所有元素。
distinct:将RDD中的元素进行去重操作。
cartesian:对两个RDD内的所有元素进行笛卡尔积操作。对于笛卡尔积操作后的数据量会呈爆炸性增长,容易导致OOM,所以尽量不要使用这类算子。
持久化算子
将数据放置在内存中(当内存不够用时,会溢出到磁盘中)。持久化操作的意义是避免了重复计算,提升框架的性能。
cache:将RDD的数据持久化到内存中。cache是懒执行,持久化的单位是partition。持久化的数据在application执行完成后会被清除。相当于persist(MEMORY_ONLY)函数功能
persist:可以指定持久化的级别。懒执行,持久化的单位是partition。持久化的数据在application执行完成后会被清除。数据会落地到磁盘,但是用户不可见。
MEMORY_ONLY:将RDD以反序列化的Java对象的形式存储在JVM中,在内存不够时,部分数据不会被缓存,每次使用时需要重新计算,默认级别。
MEMORY_AND_DISK:将RDD以反序列化的Java对象的形式存储在JVM中,在内存不够用时,将未缓存的数据分区存储在磁盘中。
MEMORY_ONLY_2,MEMORY_AND_DISK_2,....:与上述级别相同,但是每个分区会在集群中两个节点创立副本。
MEMORY_ONLY_SER:将RDD以序列化的Java对象的形式存储。这种方式比反序列化的方式节省空间。如果内存空间不够用时,部分数据不会被持久化,使用这部分数据需要重新计算。
MEMORY_AND_DISK_SER:将RDD以序列化的Java对象的形式存储。如果内存空间不够用时,无法缓存的数据分区会被溢出到磁盘中,使用这部分数据需要从磁盘读取。
DISK_ONLY:在磁盘上缓存。
OFF_HEAP:将数据存储在off-heap memory中,使用的是堆外内存。可能会利用到更大的内存存储空间,但是可能会导致GC。
chechpoint:类似于快照。可以将RDD执行到磁盘中,还可以切断RDD之间的依赖关系。在RDD执行checkpoint之前,最好是先执行cache,这样启动新的job只需要将内存的数据拷贝到HDFS就可以,省略了重新计算。需要重新指定额外的目录存储数据,由外部的存储系统管理,不是由Spark框架管理,application执行完成后持久化的数据不会被清除。即数据落地到磁盘中,但需要指定外部目录。作用是:将DAG中比较重要的中间数据做一个检查点将结果存储到高可用的集群中。
注意:懒执行必须由一个action算子触发执行。
懒执行的操作意义: 避免了大量无意义的计算,及大量无意义计算的中间结果。