大数据计算的思想--RDD理解
基于hadoop或者spark进行大数据计算或分析,旨在构建方针数据分析环境,统一把分散的数据内容在不同节点进行并行计算,得到最后汇总结果。类似python处理dataframe表的过程,只不过这个dataframe表的内容是分散到不同机器上的,构成一张大表,基于这张大表的“pandas”命令进行统计分析,也就是通过把命令分发,计算各个数据局部特征之后,根据数据局部特征汇总到整个表内容。
spark分析编程的时候可以按照大表python分析(pandas 处理)的思想进行编程,把分布式spark集群想象成一台电脑,spark主要配置知识在集群配置的时候进行参照。
1.spark rdd的五大特性
2.rdd 算子分类
3.依赖关系
窄依赖,父RDD的一个分区被最多植被一个子RDD使用,也就是一个子RDD的分区数据只流向一个父RDD分区,一般是map操作,不会产生shuffle
宽依赖,子RDD的多个分区数据会依赖于同一个父RDD分区数据,父RDD传送的时候,只传送当前分区数据的一部分。一般对应分组,排序。会产生shuffle
4.RDD是按照什么进行分区的,RDD在计算机上和分区的关系是什么
一个RDD可以包含多个计算机节点,然后由RDD分区进行操作不同的处理单元,经过中间RDD的逻辑计算之后,再经过最后一个RDD的分区进行汇总。分区可以指定,不指定的话默认按照cpu个数进行。也就是一个分区默认占用一个cpu计算资源。
5.RDD如何优化网络传输带来的计算负担
- shuffle操作带来的网络开销问题
Spark把rdd进行分区(分片),放在集群上并行计算。同一个rdd分片100个,10个节点,平均一个节点10个分区,当进行sum型的计算的时候,先进行每个分区的sum,然后把sum值shuffle传输到主程序进行全局sum,所以进行sum型计算对网络传输非常小。但对于进行join型的计算的时候,需要把数据本身进行shuffle,网络开销很大。
- 解决该问题的途径,改进hadoop中的shuffle过程,不shuffle或只有小表shuffle
Spark把key-value rdd通过key的hashcode进行分区,而且保证相同的key存储在同一个节点上,这样对改rdd进行key聚合时,就不需要shuffle过程,我们进行mapreduce计算的时候为什么要进行shuffle?,就是说mapreduce里面网络传输主要在shuffle阶段,shuffle的根本原因是相同的key存在不同的节点上,按key进行聚合的时候不得不进行shuffle。shuffle是非常影响网络的,它要把所有的数据混在一起走网络,然后它才能把相同的key走到一起。要进行shuffle是存储决定的。
Spark从这个教训中得到启发,spark会把key进行分区,也就是key的hashcode进行分区,相同的key,hashcode肯定是一样的,所以它进行分区的时候100t的数据分成10分,每部分10个t,它能确保相同的key肯定在一个分区里面,而且它能保证存储的时候相同的key能够存在同一个节点上。比如一个rdd分成了100份,集群有10个节点,所以每个节点存10份,每一分称为每个分区,spark能保证相同的key存在同一个节点上,实际上相同的key存在同一个分区。
key的分布不均决定了有的分区大有的分区小。没法分区保证完全相等,但它会保证在一个接近的范围。所以mapreduce里面做的某些工作里边,spark就不需要shuffle了,spark解决网络传输这块的根本原理就是这个。
进行join的时候是两个表,不可能把两个表都分区好,通常情况下是把用的频繁的大表事先进行分区,小表进行关联它的时候小表进行shuffle过程。
大表不需要shuffle。
需要在工作节点间进行数据混洗的转换极大地受益于分区。这样的转换是 cogroup,groupWith,join,leftOuterJoin,rightOuterJoin,groupByKey,reduceByKey,combineByKey 和lookup。
6.RDD运算过程中,分区数据丢失了怎么办
lineage机制,也叫血统机制。血统是记录RDD上的转换操作,后期如果某个RDD部分数据丢失之后,可以根据这种血统关系,自动进行重新计算,进行数据恢复。
7.RDD缓存
可以后期,在缓存中获取RDD分区中数据,不需要进行重新计算,一个场景:在某个RDD某个分区数据丢失之后,可以通过血统机制和缓存,从上一个RDD中获取缓存数据根据血统记录的转换操作,恢复数据。
8.如何设置RDD缓存
9.什么时候设置缓存
运行完成之后,缓冲自动清除。
10.spark分区原则
RDD分区的一个分区原则:尽可能是得分区的个数等于集群核心数目
无论是本地模式、Standalone模式、YARN模式或Mesos模式,我们都可以通过spark.default.parallelism来配置其默认分区个数,若没有设置该值,则根据不同的集群环境确定该值
11.spark有向无环图,为什么要划分stage,怎么理解这个stage
任务执行之后,在后续过程中spark页面,展示任务点进去会有有向无环图的展示,可以看出,这里的有向无环图分为两个阶段。
后期会对DAG划分为不同的stage称为不同的调度阶段
从算子划分,可以看出第一阶段,可以各自独立运行,就这样,后期产生了很多可以并行运行的task。
为什么要划分和怎么划分
划分阶段后,阶段内的taskset
12.stage内部的逻辑
(1)每一个stage中按照rdd的分区划分成了很多个可以并行运行的task
(2)把每一个stage中这些可以并行运行的task都封装在一个taskSet集合中
(3)rdd与rdd之间存在对应的依赖关系,stage与stage之间也存在对应的依赖关系,前面stage的task先运行,运行完成之后,后面stage中的task再运行,也就是说前面stage中task它的输出结果数据,是后面stage中task输入数据。
13.Application、job、Stage、task之间的关系
application是spark的一个应用程序,它是包含了客户端写好的代码以及任务运行的时候需要的资源信息。
后期再一个application中有很多个action操作,一个action操作就是一个job,一个job会存在大量的宽依赖,后期按照宽依赖进行stage的划分,一个job又产生了很多个stage,每一个stage内部有很多并行运行的task.
14.spark任务的提交、划分、调度流程
整体过程:提交jar包产生drive端管理,会向资源管理申请资源,资源管理申请到node节点后,node节点向drive端发送请求task运行,这时候代码跑起来就是spark内部进一步划分线程逻辑。(包含DAG /TaskShedule)