大数据计算的思想--RDD理解

大数据计算的思想--RDD理解

  基于hadoop或者spark进行大数据计算或分析,旨在构建方针数据分析环境,统一把分散的数据内容在不同节点进行并行计算,得到最后汇总结果。类似python处理dataframe表的过程,只不过这个dataframe表的内容是分散到不同机器上的,构成一张大表,基于这张大表的“pandas”命令进行统计分析,也就是通过把命令分发,计算各个数据局部特征之后,根据数据局部特征汇总到整个表内容。
  spark分析编程的时候可以按照大表python分析(pandas 处理)的思想进行编程,把分布式spark集群想象成一台电脑,spark主要配置知识在集群配置的时候进行参照。

1.spark rdd的五大特性

enter description here
enter description here

enter description here
enter description here

2.rdd 算子分类

enter description here
enter description here

3.依赖关系

  窄依赖,父RDD的一个分区被最多植被一个子RDD使用,也就是一个子RDD的分区数据只流向一个父RDD分区,一般是map操作,不会产生shuffle

enter description here
enter description here

  宽依赖,子RDD的多个分区数据会依赖于同一个父RDD分区数据,父RDD传送的时候,只传送当前分区数据的一部分。一般对应分组,排序。会产生shuffle

enter description here
enter description here

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部分数据丢失之后,可以根据这种血统关系,自动进行重新计算,进行数据恢复。

enter description here
enter description here

7.RDD缓存

  可以后期,在缓存中获取RDD分区中数据,不需要进行重新计算,一个场景:在某个RDD某个分区数据丢失之后,可以通过血统机制和缓存,从上一个RDD中获取缓存数据根据血统记录的转换操作,恢复数据。

enter description here
enter description here

8.如何设置RDD缓存

enter description here
enter description here

enter description here
enter description here

9.什么时候设置缓存

enter description here
enter description here

  运行完成之后,缓冲自动清除。

enter description here
enter description here

10.spark分区原则

  RDD分区的一个分区原则:尽可能是得分区的个数等于集群核心数目

  无论是本地模式、Standalone模式、YARN模式或Mesos模式,我们都可以通过spark.default.parallelism来配置其默认分区个数,若没有设置该值,则根据不同的集群环境确定该值

11.spark有向无环图,为什么要划分stage,怎么理解这个stage

  任务执行之后,在后续过程中spark页面,展示任务点进去会有有向无环图的展示,可以看出,这里的有向无环图分为两个阶段。

enter description here
enter description here

  后期会对DAG划分为不同的stage称为不同的调度阶段

enter description here
enter description here

  从算子划分,可以看出第一阶段,可以各自独立运行,就这样,后期产生了很多可以并行运行的task。
  为什么要划分和怎么划分
enter description here

  划分阶段后,阶段内的taskset

enter description here
enter description here

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.

enter description here
enter description here

14.spark任务的提交、划分、调度流程

enter description here
enter description here
enter description here

  整体过程:提交jar包产生drive端管理,会向资源管理申请资源,资源管理申请到node节点后,node节点向drive端发送请求task运行,这时候代码跑起来就是spark内部进一步划分线程逻辑。(包含DAG /TaskShedule)

enter description here
enter description here

原文地址:https://www.cnblogs.com/miaozhijuan/p/13125343.html