大数据--spark生态2--spark架构和rdd总结

目录

一:Spark特点

二:Spark Core

三:Spark基本概念

四.Spark架构设计

4.1 整体架构

4.2 Executor

4.3 master & worker

五:Spark基本运行流程

六:RDD概念

七:RDD支持的数据运算/算子

八:宽窄依赖以及阶段划分

九:rdd任务划分

十:rdd持久化

10.1 rdd cache

10.2 rddcheckPoint检查点

十一:累加器

十二:广播变量



一:Spark特点

  • 运行速度快:Spark使用先进的有向无环图(DAG)执行引擎,以支持循环数据流与内存计算。
  • 容易使用:Spark支持Scala, Java, Python, R语言进行编程。
  • 通用性:Spark提供强大的而完整的技术栈。
  • 运行模式多样:Spark可以运行于独立的集群模式中,或者运行于Hadoop中。

二:Spark Core

    Spark Core 包含Spark最基础最核心的功能,如内存计算,任务调度,部署模式,故障恢复,存储管理,主要面向批处理数据。Spark Core建立在同一的抽象RDD之上,使其可以以基本一致的方式来应对不同的大数据处理场景。Spark Core通常被简称为Spark.

三:Spark基本概念

  • RDD: 弹性分布式数据集,是分布式内存的一个抽象概念,提供了一种高度受限的共享内存模型。
  • DAG:有向无环图,反映RDD之间的依赖关系
  • Executor:是运行在工作节点(Worker Node)上的一个进程,负责运行任务,并为应用程序存储数据。
  • 应用Application:用户编写的spark应用程序。
  • 任务(Task):是运行在Executor上的工作单元。
  • 作业(Job):一个作业包含多个RDD及作用于相应RDD上的各种操作。
  • 阶段(Stage):是作业的基本调度单位,一个作业会分为多组任务,每组任务被称为阶段。

四.Spark架构设计

4.1 整体架构

    大数据--spark生态2--spark架构和rdd总结_第1张图片

理解:

  • 一个应用由一个Driver和若干个作业构成,一个作业由多个阶段构成,一个阶段由多个没有Shuffle关系的任务组成
  • 当执行一个应用时,Driver会像集群管理器申请资源,启动Executor,并向Executor发送应用程序代码和文件,然后在Executor上执行任务,运行结束后,执行结果会返回给Driver,或者写到HDFS或者其他数据库中。

4.2 Executor

        是集群中工作节点(worker)中的一个进jvm进程,负责在spark作业中运行具体任务(task),任务彼此之间相互独立。spark应用启动时,executor节点被同时启动,并且始终伴随着整个spark应用的生命周期而存在。executor有两个核心功能:

  • 负责运行组成spark应用程序的任务,并将结果返回给驱动器进程
  • 通过自身的快管理器(block manager)为用户程序中要求缓存的rdd提供内存式存储。

4.3 master & worker

    spark集群的独立部署环境中,不需要依赖其他的资源调度框架。自身就实现了资源调度的功能,所以环境中还有其他两个核心组件:master和worker。

  • master:是一个进程,注意负责资源的调度和分配,并进行集群的监控等职责,类似于yarn环境中的resourcemanager。
  • worker:也是一个进程,一个worker运行在集群中的一台服务器上,由master分配资源对数据进行并行的处理和计算,类似于yarn中的nodemanager

五:Spark基本运行流程

大数据--spark生态2--spark架构和rdd总结_第2张图片

  1. 首先为应用构建起基本的运行环境,即由Driver创建一个SparkContext,进行资源的申请,任务的分配和监控
  2. 资源管理器为Executor分配资源,并且启动Executor进程
  3. SparkContext根据RDD的依赖关系构建DAG图,DAG图提交给DAGScheduler解析成Stage,然后把一个个TaskSet提交给底层调度器TaskScheduler处理;Executor向SparkContext申请Task,Task Scheduler将Task发放给Executor运行,并提供给Executor运行,并提供给应用程序代码。
  4. Task在Executor上运行,把执行结果反馈给TaskScheduler, 然后反馈给DAGScheduler,运行完毕后写入数据并释放所有资源。

六:RDD概念

  • RDD提供了一个抽象的数据结构,我们不必担心底层数据的分布式特性,只需要将具体的应用逻辑表达为一系列转换处理,不同RDD之间的转换操作形成依赖关系,可以实现管道化,避免中间数据存储
  • 一个RDD就是一个分布式对象集合,本质上是一个只读的分区记录集合,每个RDD可以分成多个分区,每个分区就是一个数据集片段,并且一个RDD的不同分区可以被保存到集群中的不同的节点上,从而可以在集群的不同节点上进行并行计算。
  • RDD提供了一种高度受限的共享内存模型,即RDD是只读的记录分区的集合,不能直接修改,只能基于稳定的物理存储中的数据集创建RDD,或者通过在其它RDD上执行确定的转换操作而创建得到新的rdd

七:RDD支持的数据运算/算子

  1. 转换:map, flatmap, groupBy,   filter, distinct, sortBy, GroupByKey,  join
  2. 行动:reduce, collect, count, take, foreach

     [补充]:rdd 算子的具体使用见另外一篇博客:大数据--spark生态3--RDD算子_数据挖掘+大数据研发+算法学习-CSDN博客目录一:rdd转换算子1.1 value类型1.2 key-value类型二:rdd行动算子一:rdd转换算子1.1 value类型map将处理的数据进行映射转换,这里的转换可以是类型的转换,也可以是值的转换。mappartitions将待处理的数据以分区为单位发送到计算节点进行处理,这里的处理是指可以进行任意的处理。flatMap将处理的数据进行扁平化后再进行映射处理,所以算子也称扁平映射。glom将同一个分区的数据直接转换为相同类型的内存数组进行处https://blog.csdn.net/yezonghui/article/details/123364785

RDD的执行过程:

  1. RDD读入外部数据源进行创建
  2. RDD经过一系列的转换操作,每一次都会产生不同的RDD,供给下一个转换操作
  3. 最后一个RDD经过动作操作进行转换,并输出到外部数据源

     这一系列处理称为一个Lineage(血缘关系),即DAG拓扑排序的结果。

八:宽窄依赖以及阶段划分

  • 窄依赖:存在一个父RDD的分区对应一个子RDD的分区或者多个父RDD的分区对应于一个子RDD的分区。
  • 宽依赖:存在一个父RDD的一个分区对应一个子RDD的多个分区
  • 阶段划分:Spark根据DAG图中的RDD依赖关系,把一个作业分成多个阶段。阶段划分的依据就是宽依赖和窄依赖。只有窄依赖可以实现流水线优化,宽依赖包含Shuffle过程,无法实现流水线。
  • 具体划分方法:在DAG图中进行反向解析,遇到宽依赖就断开;遇到窄依赖就把当前RDD加入到Stage中。尽量将窄依赖划分到同一个Stage中,可以实现流水线计算

九:rdd任务划分

         rdd任务分为:application, job, stage, task.

  • application:初始化一个sparkcontext即生成一个application
  • job:一个action算子就会生成一个job
  • stage:等于宽依赖数量的个数加1
  • task:一个stage阶段中,最后一个rdd的分区个数就是task的个数。
  • 注意:application->job->stage->task每一层都是1对n的关系。

十:rdd持久化

10.1 rdd cache

    通过cache或者persist方法将前面的计算结果缓存,默认情况下会把数据缓存在jvm堆内存中,但是这两个方法被调用时并不是立即缓存,而是触发后面gaction算子时候,该rdd将会被缓存在计算节点的内存中,并提供给后面使用。

10.2 rddcheckPoint检查点

        所谓的检查点其实就是将rdd中间结果写入磁盘中,由于血缘依赖过长会造成成本过高,这样就不如在中间阶段做检查点容错,如果检查点之后节点出现问题,可以从检查点开始重做血缘,减少了开销。

十一:累加器

        累加器用来把executor端变量信息聚合到driver端,在drive程序中定义的变量,在executor端的每个task都会得到这个变量的一份新的副本,每个task更新这些副本的值后,传回driver端进行merge。

十二:广播变量

        广播变量用来实现高效分发较大的对象,向所有对象发送一个较大的只读值,以供一个或者多个spark操作使用

你可能感兴趣的:(大数据,#,spark生态,flink生态,大数据)