首页 > 其他 > 详细

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

时间:2020-06-14 17:04:31      阅读:60      评论:0      收藏:0      [点我收藏+]

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

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

1.spark rdd的五大特性

技术分享图片
enter description here

技术分享图片
enter description here

2.rdd 算子分类

技术分享图片
enter description here

3.依赖关系

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

技术分享图片
enter description here

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

技术分享图片
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

7.RDD缓存

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

技术分享图片
enter description here

8.如何设置RDD缓存

技术分享图片
enter description here

技术分享图片
enter description here

9.什么时候设置缓存

技术分享图片
enter description here

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

技术分享图片
enter description here

10.spark分区原则

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

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

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

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

技术分享图片
enter description here

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

技术分享图片
enter description here

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

  划分阶段后,阶段内的taskset

技术分享图片
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

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

技术分享图片
enter description here
技术分享图片

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

技术分享图片
enter description here

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

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!