2015-01-18 09:46:30 stark_summer 阅读数 16389
  • 深入浅出Spark

    Spark是下一代In Memory MR计算框架,性能上有数量级提升,同时支持Interactive Query、流计算、图计算等。本次视频将为大家分享Spark的核心原理,并在此基础上探讨几个Spark性能的优化点!

    17630 人正在学习 去看看 陈超

spark核心组件如下所示:




在SparkContext初始化的时候,会初始化一系列内容:

查看内存使用情况:



创建和启动scheduler:



集群核心组件中的Block tracker是用于block和partition对应关系的管理。

集群核心组件中的shuffle tracker是用于记录shuffle操作的过程细节。

从集群中也可以看出,Executor在执行任务的时候是采用多线程的方式执行的并能够在HDFS或者HBase等系统上读取数据。

而在实际的Driver Program运行的时候每个partition都会由一个task负责运行的



也就是说有多partition就会有多少task在运行,而这些task都是并发的运行在Executor中的。



2019-10-04 14:06:10 lidazhou 阅读数 34
  • 深入浅出Spark

    Spark是下一代In Memory MR计算框架,性能上有数量级提升,同时支持Interactive Query、流计算、图计算等。本次视频将为大家分享Spark的核心原理,并在此基础上探讨几个Spark性能的优化点!

    17630 人正在学习 去看看 陈超

一、Spark核心组件

实际工作中,会使用YARN Cluster模式。Spark在执行过程中懒执行,直到action操作时才触发job,之后根据宽依赖划分stage,stage被整理成TaskSet,TaskSet里面有多个task,每个task被分发到具体的executor里执行。

1、Driver

Spark驱动节点,用于执行Spark任务中的main方法,负责实际代码的执行工作。Driver在Spark作业执行时主要负责:

1)将用户程序转化为job;

2)在Executor之间调度Task;

3)跟踪Executor的执行情况;

4)通过UI查询展示运行情况;

2、Executor

Executor节点是一个JVM进程,负责运行具体任务,任务之间相互独立。

Spark应用启动时,Executor节点被同时启动,并且始终伴随着整个Spark应用的生命周期。

如果有Executor节点发生故障或者崩溃,Spark应用会将出错节点上的任务调度到其他Executor节点上继续运行。

Executor有两个核心功能:

1)负责运行组成Spark应用的任务,并将结果返回给驱动器进程;

2)Executor通过自身的块管理器(Block Manager)为用户程序中要求缓存的RDD提供内存式存储。RDD是直接缓存在Executor进程内的,因此任务可以在运行时充分利用缓存数据加速运算。

3、Spark通用运行流程概述:    

不论Spark以何种模式进行部署,任务提交后,都会先启动Driver进程,随后Driver进程集群管理器注册应用程序,之后集群管理器根据配置文件分配并启动Executor,当Driver所需的资源全部满足后,Driver开始执行main函数,Spark查询为懒执行,当执行到action算子时开始反向推算,根据宽依赖进行stage划分,随后每一个stage对应一个taskset,taskset中有多个task,根据本地化原则,task会被分发到指定的executor去执行,在任务执行过程中,Executor也会不断与Driver进行通信,报告任务运行情况。

4、YARN Cluster模式:

在YARN Cluster模式下,任务提交后会和ResourceManager通讯申请启动 ApplicationMaster, 随后 ResourceManager  分配 container,在合适的 NodeManager上启动 ApplicationMaster,此时的 ApplicationMaster 就是 Driver。

Driver 启动后向 ResourceManager 申请 Executor内存,ResourceManager接到ApplicationMaster 的资源申请后会分配 container,然后在合适的 NodeManager 上启动 Executor 进程,Executor 进程启动后会向Driver反向注册,Executor全部注册完成后Driver开始执行main函数,之后执行到 Action 算子时,触发一个 job,并根据宽依赖开始划分 stage,每个stage生成对应的taskSet,之后将 task  分发到各个Executor上执行。

 

 

2019-11-13 23:55:48 Faded1573606285 阅读数 18
  • 深入浅出Spark

    Spark是下一代In Memory MR计算框架,性能上有数量级提升,同时支持Interactive Query、流计算、图计算等。本次视频将为大家分享Spark的核心原理,并在此基础上探讨几个Spark性能的优化点!

    17630 人正在学习 去看看 陈超

1. BlockManager数据存储与管理机制

BlockManager是整个Spark底层负责数据存储与管理的一个组件,Driver和Executor的所有数据都由对应的BlockManager进行管理。

Driver上有BlockManagerMaster,负责对各个节点上的BlockManager内部管理的数据的元数据进行维护,比如block的增删改等操作,都会在这里维护好元数据的变更。

每个节点都有一个BlockManager,每个BlockManager创建之后,第一件事即使去向BlockManagerMaster进行注册,此时BlockManagerMaster会为其长难句对应的BlockManagerInfo。

BlockManager运行原理如下图所示:

BlockManagerMaster与BlockManager的关系非常像NameNode与DataNode的关系,BlockManagerMaster中保存中BlockManager内部管理数据的元数据,进行维护,当BlockManager进行Block增删改等操作时,都会在BlockManagerMaster中进行元数据的变更,这与NameNode维护DataNode的元数据信息,DataNode中数据发生变化时NameNode中的元数据信息也会相应变化是一致的。

每个节点上都有一个BlockManager,BlockManager中有3个非常重要的组件:

  • DiskStore:负责对磁盘数据进行读写;
  • MemoryStore:负责对内存数据进行读写;
  • BlockTransferService:负责建立BlockManager到远程其他节点的BlockManager的连接,负责对远程其他节点的BlockManager的数据进行读写;

每个BlockManager创建之后,做的第一件事就是想BlockManagerMaster进行注册,此时BlockManagerMaster会为其创建对应的BlockManagerInfo

使用BlockManager进行写操作时,比如说,RDD运行过程中的一些中间数据,或者我们手动指定了persist(),会优先将数据写入内存中,如果内存大小不够,会使用自己的算法,将内存中的部分数据写入磁盘;此外,如果persist()指定了要replica,那么会使用BlockTransferService将数据replicate一份到其他节点的BlockManager上去。

使用BlockManager进行读操作时,比如说,shuffleRead操作,如果能从本地读取,就利用DiskStore或者MemoryStore从本地读取数据,但是本地没有数据的话,那么会用BlockTransferService与有数据的BlockManager建立连接,然后用BlockTransferService从远程BlockManager读取数据;例如,shuffle Read操作中,很有可能要拉取的数据在本地没有,那么此时就会到远程有数据的节点上,找那个节点的BlockManager来拉取需要的数据。

只要使用BlockManager执行了数据增删改的操作,那么必须将Block的BlockStatus上报到BlockManagerMaster,在BlockManagerMaster上会对指定BlockManager的BlockManagerInfo内部的BlockStatus进行增删改操作,从而达到元数据的维护功能。

 

2 Spark 共享变量底层实现

Spark一个非常重要的特性就是共享变量

默认情况下,如果在一个算子的函数中使用到了某个外部的变量,那么这个变量的值会被拷贝到每个task,此时每个task只能操作自己的那份变量副本。如果多个task想要共享某个变量,那么这种方式是做不到的。

Spark为此提供了两种共享变量,一种是Broadcast Variable广播变量),另一种是Accumulator累加变量)。Broadcast Variable会将用到的变量,仅仅为每个节点拷贝一份,即每个Executor拷贝一份,更大的用途是优化性能,减少网络传输以及内存损耗。Accumulator则可以让多个task共同操作一份变量,主要可以进行累加操作。Broadcast Variable是共享读变量,task不能去修改它,而Accumulator可以让多个task操作一个变量。

 

2.1 广播变量

广播变量允许编程者在每个Executor上保留外部数据的只读变量,而不是给每个任务发送一个副本

每个task都会保存一份它所使用的外部变量的副本,当一个Executor上的多个task都使用一个大型外部变量时,对于Executor内存的消耗是非常大的,因此,我们可以将大型外部变量封装为广播变量,此时一个Executor保存一个变量副本,此Executor上的所有task共用此变量,不再是一个task单独保存一个副本,这在一定程度上降低了Spark任务的内存占用。

Spark还尝试使用高效的广播算法分发广播变量,以降低通信成本。

Spark提供的Broadcast Variable是只读的,并且在每个Executor上只会有一个副本,而不会为每个task都拷贝一份副本,因此,它的最大作用,就是减少变量到各个节点的网络传输消耗,以及在各个节点上的内存消耗。此外,Spark内部也使用了高效的广播算法来减少网络消耗。

可以通过调用SparkContext的broadcast()方法来针对每个变量创建广播变量。然后在算子的函数内,使用到广播变量时,每个Executor只会拷贝一份副本了,每个task可以使用广播变量的value()方法获取值。

在任务运行时,Executor并不获取广播变量,当task执行到 使用广播变量的代码时,会向Executor的内存中请求广播变量,如下图所示:

之后Executor会通过BlockManager向Driver拉取广播变量,然后提供给task进行使用,如下图所示:

广播大变量是Spark中常用的基础优化方法,通过减少内存占用实现任务执行性能的提升。

 

2.2 累加器

累加器(accumulator):Accumulator是仅仅被相关操作累加的变量,因此可以在并行中被有效地支持。它们可用于实现计数器(如MapReduce)或总和计数

Accumulator是存在于Driver端的,集群上运行的task进行Accumulator的累加,随后把值发到Driver端,在Driver端汇总(Spark UI在SparkContext创建时被创建,即在Driver端被创建,因此它可以读取Accumulator的数值),由于Accumulator存在于Driver端,从节点读取不到Accumulator的数值

Spark提供的Accumulator主要用于多个节点对一个变量进行共享性的操作。Accumulator只提供了累加的功能,但是却给我们提供了多个task对于同一个变量并行操作的功能,但是task只能对Accumulator进行累加操作,不能读取它的值,只有Driver程序可以读取Accumulator的值。

Accumulator的底层原理如下图所示:

2018-10-16 20:10:00 weixin_30662109 阅读数 9
  • 深入浅出Spark

    Spark是下一代In Memory MR计算框架,性能上有数量级提升,同时支持Interactive Query、流计算、图计算等。本次视频将为大家分享Spark的核心原理,并在此基础上探讨几个Spark性能的优化点!

    17630 人正在学习 去看看 陈超

Spark核心组件

1、RDD

resilient distributed dataset, 弹性分布式数据集。逻辑上的组件,是spark的基本抽象,代表不可变,分区化的元素集合,可以进行并行操作。该类封装了RDD的基本操作,例如map、filter、persist等,除此以外,PairRDDFunctions封装了KV类型RDD的操作,例如groupByKey和join。对于spark的KV类型RDD直接隐式转换成PairRDDFunctions类,具备了byKey的操作。

RDD轻量级集合,内部没有数据。内部,每个RDD具有5方面主要属性:

  1. 分区列表
  2. 用于计算每个切片的函数(算法)
  3. 到其他RDD的依赖列表
  4. (可选)对于KV类型的RDD有一个分区类
  5. (可选)计算每个切片的首选位置列表

spark中所有的调度和执行都是基于这些方法,也允许每个RDD实现自己的计算方式。RDD的方法主要包含两种类型Transformations和action。返回rdd都是变换,不会导致job的执行,延迟计算,延迟到action方法的调用。

1.1 transform

  • map
  • filter
  • mapValues
  • flatMap
  • reduceByKey
  • groupByKey
  • sortByKey

2、SparkContext

上下文创建时,在worker节点直接启动job的执行器进程(CoarseGrainedExecutorBackend),spark入口点,表示到spark集群的一个连接。创建该类时,同时创建task调度器和后台调度器,后台调度器还要决定默认并发度问题。

3、DagScheduler

高级调度层,面向stage进行调度,为每个job计算stage,寻找最优路径执行job。该调度器以taskset方式提交stage给下层调度器(TaskScheduler)。Spark以shuffle为边界,将众多的RDD划分成stage,窄依赖的RDD划分到一个stage中。shuffle依赖需要多个stage,DAG调度检测运行task的首选位置,该调度器将位置信息和状态传递给底层的task调度器。DAG调度器处理因shuffle output丢失导致故障,此时上一个stage需要重新提交。在阶段stage内,不是由shuffle output丢失导致的故障都由下层的task调度器处理。缓存跟踪,避免rdd重复计算。首选位置:首选那个节点来执行task。为了防止内存泄漏,job完成后清除数据结构。递归提交每个Stage,每个stage都是以Tasket方式提交任务集合给下层的TaskScheduler,因此Dag调度器需要计算每个stage的任务集合。提交的阶段通过分区列表映射成Task集合,ShuffleMapStage对应ShuffleTask,ResultStage对应
ResultTask。

4、TaskSchedulerImpl

5、SchedulerBackend

6、job

activejob,提交给调度器的最顶层work单位,每个job可能需要多各stage的执行,并产生中间结果。

7、stage

stage是task的集合,数量同stage的最后的一个rdd的分区数相同。stage按照shuffle进行划分边界,存在前后依赖,上一阶段计算输出,下一个提取上一个的结果。主要有两种类型stage:

  1. ResultStage
    最后的阶段,执行action。在RDD的某些分区上应用函数来计算action的结果。
  2. ShuffleMapStage
    产生map的output,stage如果重用了rdd,可以跨job共享。该阶段是DAG图计算过程中的中间阶段,执行时保存输出文件供reduce任务抓取,该阶段可以单独提交,DagScheduler.submitMapStage();

8、Task

转载于:https://www.cnblogs.com/xupccc/p/9800349.html

2018-10-12 20:08:00 weixin_34186950 阅读数 28
  • 深入浅出Spark

    Spark是下一代In Memory MR计算框架,性能上有数量级提升,同时支持Interactive Query、流计算、图计算等。本次视频将为大家分享Spark的核心原理,并在此基础上探讨几个Spark性能的优化点!

    17630 人正在学习 去看看 陈超

 

0. 说明

   【Spark 核心组件示意图】

  

 

 


 

1. RDD

  resilient distributed dataset , 弹性数据集
  轻量级的数据集合,逻辑上的集合。等价于 list
  没有携带数据。

 

 


 

2. 依赖

  RDD 的依赖是 子 RDD 上的每个分区和父 RDD 分区数量上的对应关系
  Dependency
    |----ShuffleDependency (宽依赖)
    |----NarrowDependency (窄依赖:子 RDD 的每个分区依赖少量的父 RDD 分区)
      |-----One2OneDependency (一对一依赖)
      |-----RangeDependency(范围依赖)
      |-----PruneDependency(Prune 依赖)

 


 

3. Stage(阶段)

  并行的 task 集合,同一 Stage 的所有任务有着相同的 Shuffle 依赖。

  阶段,一组RDD构成的链条。
  阶段的划分按照 Shuffle 标记来进行的。
  阶段类型有两种,ShuffleMapStage 和ResultStage。


  【ShuffleMapStage】
  该阶段任务的结果是下一个阶段任务的输入。需要跟踪每个分区所在的节点。

  任务执行期间的中间过程,保存task的输出数据供下一个 reduce 进行 fetch(抓取) 。

  该阶段可以单独提交。

 

  【 ResultStage】
  结果结果直接执行 RDD 的 action 操作。

  对一些分区应用计算函数(不一定需要在所有分区进行计算,比如说first())。

  最后一个阶段,执行task后的结果回传给driver

 


 

4. Task

  task 是 Spark 执行单位,有两种类型。


  【ShuffelMapTask】
  在 ShuffleMapStage 由多个 ShuffleMapTask 组成。

 

  【ResultTask】
  ResultStage 由多个 ResultTask 组成,结果任务直接 task 后,将结果回传给 driver。

 

  driver:

 


 

 

5.  job

  一个 action 就是一个 job

 


 

6. Application

  一个应用可以包含多个 job

 

 


7. Spark Context

  Spark 上下文是 Spark 程序的主入口点,表示到 Spark 集群的连接。可以创建 RDD 、累加器和广播变量。
  每个 JVM 只能有一个 active 的上下文,如果要创建新的上下文,必须将原来的上下文 stop。

  sc.textFile("");
  sc.parallelize(1 to 10);
  sc.makeRDD(1 to 10) ;          //通过parallelize实现。

 

 


 

转载于:https://www.cnblogs.com/share23/p/9775167.html

没有更多推荐了,返回首页