spark core内容汇总
-
RDD的数据类型
转换算子transformation:
map
flatMap
mapPartitions
distinct
reduceByKey
groupByKey
groupBy
filter
repartition
union
subtract
intersection
cache
persist行动算子action:
collect:将分布式集群executor端的数据拉到driver端的内存中,转化为一般的集合
saveAsTestFile:将分布式集群executor端的数据写入到hdfs中保存
foreach:将分布式集群executor端的数据分别某个操作,可以不返回数据
count:统计分布式集群executor端的数据多少 -
shuffle操作的原理
Shuffle作为处理连接map端和reduce端的枢纽,shuffle的性能高低直接影响了整个程序的性能和吞吐量
shuffle的过程都要落盘,不能直接在内存中进行,因此shuffle的成本是很高的,具体:
在map阶段,除了map的业务逻辑外,还有shuffle write的过程,这个过程涉及到序列化、磁盘IO等耗时操作;
在reduce阶段,除了reduce的业务逻辑外,还有前面shuffle read过程,这个过程涉及到网络IO、反序列化等耗时操作。
所以整个shuffle过程是极其昂贵的,spark在shuffle的实现上也做了很多优化改进,随着版本的迭代发布,spark shuffle的实现也逐步得到改进
整个DAG的任务以shuffle作为划分任务的依据,划分为不同的stage,同一个stage内是不存在shuffle操作的(也叫窄依赖),不同的stage之间用shuffle连接(叫做宽依赖) -
groupByKey和reduceByKey的区别
由于shuffle会进行数据落盘和读盘操作,影响程序的性能和任务的运行时间,因此一般在shuffle之前在对每个分区内相同的key会进行预聚合(combine),预聚合可以有效降低shuffle落盘的数据量,提高shuffle的效率。例如reduceByKey会在map端进行预聚合后进行shuffle操作,提高shuffle的效率。
但是groupByKey的作用只是进行分组,不存在预聚合的概念,因此所有的数据都会进行shuffle落盘,是比较耗时的;
所以当reduceByKey和groupByKey都可以选择时,优先选择reduceByKey;但是如果需要得到分组后的数据,则只能选择groupByKey -
distinct的原理
distinct也是通过reduceByKey实现的,在map进行预聚合,然后进行shuffle