心有多大,世界就有多大

Spark编程模型(核心篇 一)

目录

  • RDD概述
  • RDD实现
  • RDD运行流程
  • RDD分区
  • RDD操作分类
  • RDD编程接口说明


一、RDD概述


  • RDD:是Resilient distributed datasets的简称,中文为弹性分布式数据集;是Spark最核心的模块和类

  • DAG:
  • Spark将计算转换为一个有向无环图(DAG)的任务集合,通过为RDD提供一种基于粗粒度变换(如map, filter, join等)的接口
  • RDD类型:ParallelCollectionRDD, MapPartitionsRDD (mappedRDD?), UnionRDD…., ShuffledRDD, SchemaRDD, Results
  • RDD操作分类:转换操作(又分为创建操作、转换操作)、行为操作(又分控制操作-进行RDD持久化、行为操作)


二、RDD实现


1、作业调度

   A、当对RDD执行转换操作时,调度器会根据RDD的“血统”来构建由若干高度阶段(Stage)组成的有向无环图(DAG), 每个阶段包含尽可能多的连续“窄依赖”转换

   B、另外,调度分配任务采用“延时调度”机制,并根据”数据本地性“来确定


宽依赖与窄依赖:

  • 依赖是指父RDD的每个分区只被子RDD的一个分区所使用,子RDD一般对应父RDD的一个或者多个分区。(与数据规模无关)不会产生shuffle
  • 依赖指父RDD的多个分区可能被子RDD的一个分区所使用,子RDD分区通常对应所有的父RDD分区(与数据规模有关),会产生shuffle
  • 更细化文档可参见 https://blog.csdn.net/weixin_39043567/article/details/89520896 

                                                     



2、解析器集成:三个步骤 A、用户每一行输入编译成一个类 B、类加载至JVM中  C、调用 类函数

3、内存管理:

  • 提供了3种持久化RDD的存储策略: A、未序列化Java对象存在内存中  B、序列化数据存在内存中  C、序列化数据存储在磁盘中
  • 对内存使用LRU回收算法进行管理 (以RDD为单位)

4、检查点(Checkpoint)支持

  • 为RDD提供设置Checkpoint的API,以将一些Checkpoint保存在外部存储中

5、多用户管理:提供公平调度算法、延迟调度、作业取消机制、细粒度资源共享、数据本地性


三、RDD运行流程


RDD在Spark中运行大概分为以下三步:

  1. 创建RDD对象
  2. DAGScheduler模块介入运算,计算RDD之间的依赖关系,RDD之间的依赖关系就形成了DAG
  3. 每一个Job被分为多个Stage。划分Stage的一个主要依据是当前计算因子的输入是否是确定的,如果是则将其分在同一个Stage,避免多个Stage之间的消息传递开销

示例图如下:


  • 以下面一个按 A-Z 首字母分类,查找相同首字母下不同姓名总个数的例子来看一下 RDD 是如何运行起来的

  • 创建 RDD  上面的例子除去最后一个 collect 是个动作,不会创建 RDD 之外,前面四个转换都会创建出新的 RDD 。因此第一步就是创建好所有 RDD( 内部的五项信息 )?
  • 创建执行计划 Spark 会尽可能地管道化,并基于是否要重新组织数据来划分 阶段 (stage) ,例如本例中的 groupBy() 转换就会将整个执行计划划分成两阶段执行。最终会产生一个 DAG(directed acyclic graph ,有向无环图 ) 作为逻辑执行计划

  • 调度任务  将各阶段划分成不同的 任务 (task) ,每个任务都是数据和计算的合体。在进行下一阶段前,当前阶段的所有任务都要执行完成。因为下一阶段的第一个转换一定是重新组织数据的,所以必须等当前阶段所有结果数据都计算出来了才能继续


三、RDD分区


1、RDD分区计算

2、RDD分区函数,以及默认提供两种划分器:哈希分区划分器和范围分区划分器


四、RDD操作函数


Spark转换操作函数讲解: https://www.cnblogs.com/jinggangshan/p/8086492.html  

                                   https://blog.csdn.net/taokeblog/article/details/103796987

行动操作函数讲解:


五、RDD编程接口说明


    Spark提供了通用接口来抽象每个RDD,包括

1、分区信息:数据集的最小分片

2、依赖关系

3、函数

4、划分策略和数据位置的元数据

posted on 2020-01-08 13:40  心有多大,世界就有多大  阅读(274)  评论(0编辑  收藏  举报

导航