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.排序操作:
sortBy、sortByKey等。
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):对调用map的RDD数据集中的每个element都使用func,然后返回一个新的RDD,这个返回的数据集是分布式的数据集
2. filter(func) : 对调用filter的RDD数据集中的每个元素都使用func,然后返回一个包含使func为true的元素构成的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中的distinct的element
9. groupByKey(numTasks):返回(K,Seq[V]),也就是hadoop中reduce函数接受的key-valuelist
10. reduceByKey(func,[numTasks]):就是用一个给定的reduce func再作用在groupByKey产生的(K,Seq[V]),比如求和,求平均数
11. sortByKey([ascending],[numTasks]):按照key来进行排序,是升序还是降序,ascending是boolean类型
12. join(otherDataset,[numTasks]):当有两个KV的dataset(K,V)和(K,W),返回的是(K,(V,W))的dataset,numTasks为并发的任务数
13. cogroup(otherDataset,[numTasks]):当有两个KV的dataset(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):返回前n个elements,这个士driver program返回的
6. takeSample(withReplacement,num,seed):抽样返回一个dataset中的num个元素,随机种子seed
7. saveAsTextFile(path):把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.资源调度+分配
作者:西伯尔
出处:http://www.cnblogs.com/sybil-hxl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。