1.RDD

(1)RDD产生背景

为了解决开发人员能在大规模的集群中以一种容错的方式进行内存计算,提出了 RDD 的概念,而当前的很多框架对迭代式算法场景与交互性数据挖掘场景的处理性能非常差, 这个是RDDs 的提出的动机。

(2)什么是 RDD

RDD 是 Spark 的计算模型。RDD(Resilient Distributed Dataset)叫做弹性分布式数据集合,是 Spark 中最基本的数据抽象,它代表一个不可变、只读的,被分区的数据集。操作 RDD 就像操作本地集合一样,有很多的方法可以调用,使用方便,而无需关心底层的调度细节。


参考:

https://blog.csdn.net/weixin_35353187/java/article/details/82859212

2.Shuffle

如何理解Shuffle? 列举出会触发shuffle的算子

(1)Shuffle

把父RDD中的KV对按照Key重新分区,从而得到一个新的RDD。也就是说原本同属于父RDD同一个分区的数据需要进入到子RDD的不同的分区。

在分布式计算框架中,数据本地化是一个很重要的考虑,即计算需要被分发到数据所在的位置,从而减少数据的移动,提高运行效率。

Map-Reduce的输入数据通常是HDFS中的文件,所以数据本地化要求map任务尽量被调度到保存了输入文件的节点执行。但是,有一些计算逻辑是无法简单地获取本地数据的,reduce的逻辑都是如此。对于reduce来说,处理函数的输入是key相同的所有value,但是这些value所在的数据集(即map的输出)位于不同的节点上,因此需要对map的输出进行重新组织,使得同样的key进入相同的reducer。 shuffle移动了大量的数据,对计算、内存、网络和磁盘都有巨大的消耗,因此,只有确实需要shuffle的地方才应该进行shuffle,否则尽可能避免shuffle。

(2)会触发shuffle的算子:

1.去重操作:

distinct等。

2.聚合操作

reduceByKey、groupBy、groupByKey、aggregateByKey、combineByKey等。

byKey类的操作要对一个key,进行聚合操作,那么肯定要保证集群中,所有节点上的相同的key,移动到同一个节点上进行处理。

3.排序操作:

sortBysortByKey等。

4.重分区操作:

repartition、repartitionAndSortWithinPartitions、coalesce(shuffle=true)等。

重分区一般会shuffle,因为需要在整个集群中,对之前所有的分区的数据进行随机,均匀的打乱,然后把数据放入下游新的指定数量的分区内。

5.集合或者表操作:

join、cogroup、leftOuterJoin、intersection、subtract、subtractByKey等。

两个rdd进行join,就必须将相同join key的数据,shuffle到同一个节点上,然后进行相同key的两个rdd数据的笛卡尔乘积。

 

参考:

https://blog.csdn.net/u011204487/article/details/103906770

https://blog.csdn.net/qq_16504067/article/details/103022603

3.transform和action算子

Spark的计算模型,官方文档 http://spark.apache.org/docs/latest/rdd-programming-guide.html

(1)什么是Transformation和 Action?

Transformation 转换算子:是得到一个新的RDD,方式很多,比如从数据源生成一个新的RDD,从RDD生成一个新的RDD。这种变换并不触发提交作业,完成作业中间过程处理。Transformation 操作都是采用的懒策略,提交Transformation马上执行计算,需要等到有 Action 被提交的时候才会真正触发运算。

Action 行动算子:action是得到一个值,或者一个结果(直接将RDD cache到内存中)这类算子会触发 SparkContext 提交 Job 作业。

(2)transformation常见操作

1. map(func):对调用mapRDD数据集中的每个element都使用func,然后返回一个新的RDD,这个返回的数据集是分布式的数据集

2. filter(func) : 对调用filterRDD数据集中的每个元素都使用func,然后返回一个包含使functrue的元素构成的RDD

3. flatMap(func):map差不多,但是flatMap生成的是多个结果

4. mapPartitions(func):map很像,但是map是每个element,而mapPartitions是每个partition

5. mapPartitionsWithSplit(func):mapPartitions很像,但是func作用的是其中一个split上,所以func中应该有index

6. sample(withReplacement,faction,seed):抽样

7. union(otherDataset):返回一个新的dataset,包含源dataset和给定dataset的元素的集合

8. distinct([numTasks]):返回一个新的dataset,这个dataset含有的是源dataset中的distinctelement

9. groupByKey(numTasks):返回(K,Seq[V]),也就是hadoopreduce函数接受的key-valuelist

10. reduceByKey(func,[numTasks]):就是用一个给定的reduce func再作用在groupByKey产生的(K,Seq[V]),比如求和,求平均数

11. sortByKey([ascending],[numTasks]):按照key来进行排序,是升序还是降序,ascendingboolean类型

12. join(otherDataset,[numTasks]):当有两个KVdataset(K,V)(K,W),返回的是(K,(V,W))dataset,numTasks为并发的任务数

13. cogroup(otherDataset,[numTasks]):当有两个KVdataset(K,V)(K,W),返回的是(K,Seq[V],Seq[W])dataset,numTasks为并发的任务数

14. cartesian(otherDataset):笛卡尔积就是m*n,大家懂的

(3) action常见操作

1. reduce(func):说白了就是聚集,但是传入的函数是两个参数输入返回一个值,这个函数必须是满足交换律和结合律的

2. collect():一般在filter或者足够小的结果的时候,再用collect封装返回一个数组

3. count():返回的是dataset中的element的个数

4. first():返回的是dataset中的第一个元素

5. take(n):返回前nelements,这个士driver program返回的

6. takeSample(withReplacementnumseed):抽样返回一个dataset中的num个元素,随机种子seed

7. saveAsTextFilepath):把dataset写到一个text file中,或者hdfs,或者hdfs支持的文件系统中,spark把每条记录都转换为一行记录,然后写到file

8. saveAsSequenceFile(path):只能用在key-value对上,然后生成SequenceFile写到本地或者hadoop文件系统

9. countByKey():返回的是key对应的个数的一个map,作用于一个RDD

10. foreach(func):dataset中的每个元素都使用func

 

参考:

https://blog.csdn.net/weixin_34254823/article/details/91731844

 

4.Spark闭包

 [挑战题] 如何理解spark程序闭包 ?

闭包:跨作用域访问函数变量。又指的一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。为了执行作业,Spark将RDD操作的处理分解为tasks,每个task由Executor执行。在执行之前,Spark会计算task的闭包。闭包是Executor在RDD上进行计算的时候必须可见的那些变量和方法(在这种情况下是foreach())。闭包会被序列化并发送给每个Executor。

5.资源调度+分配

https://www.cnblogs.com/sybil-hxl/p/13292210.html

posted on 2020-07-14 02:39  西伯尔  阅读(398)  评论(0)    收藏  举报