文章目录
1.RDD中reduceBykey与groupByKey哪个性能好,为什么?
reduceByKey:reduceByKey会在结果发送至reducer之前会对每个mapper在本地进行merge,有点类似于在MapReduce中的combiner。这样做的好处在于,在map端进行一次reduce之后,数据量会大幅度减小,从而减小传输,保证reduce端能够更快的进行结果计算。
groupByKey:groupByKey会对每一个RDD中的value值进行聚合形成一个序列(Iterator),此操作发生在reduce端,所以势必会将所有的数据通过网络进行传输,造成不必要的浪费。同时如果数据量十分大,可能还会造成OutOfMemoryError。
通过以上对比可以发现在进行大量数据的reduce操作时候建议使用reduceByKey。不仅可以提高速度,还是可以防止使用groupByKey造成的内存溢出问题。
2.Spark与MapReduce的区别
- 针对迭代的业务场景,Spark可以基于内存计算,MR是基于磁盘
spark与Hadoop MR不同的是,任务的中间结果可以保存到内存中,大大地提高了计算性能. - Spark中有DAG有向无环图来切分任务的执行先后顺序
- Spark存储数据可以指定副本个数(持久化存储),MR默认3份。
- MapReduce中只有map reduce两端,逻辑实现需要自己实现, Spark中有各种场景算子适用不同的场景。
spark中做了很多已有的算子的封装,提供了各种场景的算子,而MR中只有map和reduce 相当于Spark中的map和reduceByKey两个算子 - Spark是粗粒度资源申请,Application执行快,MR是细粒度资源申请
- Spark中shuffle map端自动聚合功能,MR需要手动设置
- Spark中shuffle ByPass机制有自己灵活的实现
3.Spark运行模式(部署模式)
-
Local
在本地eclipse、IDEA中写spark代码运行程序,一般用于测试
-
Standalone
spark自带的资源调度框架(可以抛开hdfs,抛开yarn去运行),支持完全分布式集群搭建。Spark可以运行在standalone集群上
-
Yarn
Hadoop生态圈里面的一个资源调度框架,Spark也是可以基于Yarn来计算的。
要基于Yarn来进行资源调度,必须实现AppalicationMaster接口,Spark实现了这个接口,所以可以基于Yarn。
-
Mesos
运行在 mesos 资源管理器框架之上,由 mesos 负责资源管理,Spark 负责任务调度和计算,(很少用)
4.RDD五大特性
- RDD是由一系列的partition组成的。
- 算子(函数)是作用在RDD的每一个partition(split)上的。
算子:Spark中,RDD的方法就叫算子(也叫函数)如flatMap,map,reduceByKey,foreach - RDD之间有一系列的依赖关系,可以基于上一个RDD重新计算出RDD。。
RDD2丢失了的话,可以将flatMap作用到RDD1上来生成RDD2
RDD2依赖于RDD1产生,RDD3依赖于RDD2来产生 - 分区器是作用在K,V格式的RDD上。
分区器:决定数据去哪一个分区 hash()%reduce个数 - Partition对外提供最佳的计算位置,利于数据处理的本地化。“计算移动,数据不移动”
如要处理某个节点上的数据时
5.RDD的弹性体现在什么方面?
1.自动进行内存和磁盘数据存储的切换
Spark优先把数据放到内存中,如果内存放不下,就会放到磁盘里面,程序进行自动的存储切换
2.基于Lineage(血统)的高效容错机制
在RDD进行转换和动作的时候,会形成RDD的Lineage依赖链,当某一个RDD失效的时候,可以通过重新计算上游的RDD来重新生成丢失的RDD数据。
3.Task 如果失败会自动进行特定次数的重试
默认重试次数是4次。
TaskSchedulerImpl 是底层任务调度TaskScheduler的实现,这些Schedulers 从每一个Stage 中的DAGScheduler 中获取TaskSet,运行它们会尝试是否有故障。
4.Stage 如果失败会自动进行特定次数的重试,而且只会计算失败的分片
Stage 类注释
Finally, a single stage can be re-executed in multiple attempts due to fault recovery. In that* case, the Stage object will track multiple StageInfo objects to pass to listeners or the web UI.* The latest one will be accessible through latestInfo.
5.checkpoint 和persist,可主动或被动触发
RDD可以通过Persist持久化将RDD缓存到内存或者磁盘,当再次用到该RDD时直接读取就行。也可以将RDD进行检查点,检查点会将数据存储在HDFS中,该RDD的所有父RDD依赖都会被移除
checkpoint【每次对RDD操作都会产生新的RDD,如果链条比较长,计算比较笨重,就把数据放在硬盘中】和persist 【内存或磁盘中对数据进行复用】(检查点、持久化)
6.数据调度弹性: DAGScheduler ,TASKScheduler调度 和资源管理无关
Spark 将Job执行模型抽象为通用的有向无环图(DAG),这可以将多Stage的任务串联或并行执行,从而不需要将Stage 中间结果写到HDFS 中,调度引擎自动处理Stage的失败以及Task的失败。
7.数据分片的高度弹性(coalesce,repartition)
可以根据业务的特征,动态调整数据分片的个数,提升整体的应用执行效率。