浅谈火花内部运行机制

    <>

    火花中最重要的机制有那些?

    1.抽样,2.火花调度机制,3洗牌过程

    <李>

    什么是抽样?

    可以这么说,你懂了抽样,基本上就可以对Hadoop和火花的一半给吃透了,那么到底是抽样

    抽样(弹性分布式数据集)首先体现数据集,抽样是对原始数据的封装,该种数据结构内部可以对数据进行逻辑分区,其次分布式体现是并行计算以及需要解决容错问题,也就是根据依赖,找到第一层抽样,最后根据抽样编号与分区编号,可以唯一确定该分区对应的块编的号,就能从存储介质中提取出分区对应的数据。在就是弹性,抽样在可以不改变内部存储数据记录的前提下,去调整并行计算单元的划分结构(这个可能就是阶段)

    <李>

    基本概念

    (1)应用程序:用户构建的火花应用程序,包含驱动程序(一个司机功能的代码)和在集群的多个工作结点上运行的遗嘱执行人代码。

    (2)驱动程序:包含主要入口函数并在主要函数内实例化SparkContext对象的应用程序称为驱动应用程序。不说了,直接上代码如下:

    Var日志文件=" YOUR_SPARK_HOME/README。md”//本地文件目录
    val相依=new SparkConf ()。setAppName("Simple Application");//给Application命名
    val sc=new SparkContext(conf);

    (3)Master(ClusterManager)管理者整个集群,目前Spark主要支持三种类型:Standlone模式,Mesos模式,Yarn模式。

    (4)Worker节点:运行Worker守护进程的集群结点。

     

    (5)任务执行器(Executor):一个Worker节点上可能有多个Executor, 每个Executor都拥有固定的核心数量和堆栈大小。

    (6)作业(job)::包含多个Task(任务)组成的并行计算(并排的那些分区)),往往由Spark的action触发产生。在Spark中通过runJob方法向Spark集群中提交Job

    (7)阶段(Stage):每个job会因为RDD之间的依赖关系被拆分成多个Task集合,其名称称为Stage,每一个Task集合,也可以叫TaskSet(任务集)

    补充:

    每个Application中可能有多个job,相互独立。

    每个Worker可以起一个或多个Executor。
    每个Executor由若干core组成,每个Executor的每个core一次只能执行一个Task。
    每个Task执行的结果就是生成了目标RDD的一个partiton。

  1. 依赖于并行计算如何理解?

    :一个原始数据分成了10个分区,那么就可以同时并行这个10分区,是不是可以这样去理解?不一定,如果都是窄依赖,没有问题,但其中会涉及到宽依赖,这其中就会产生分区与分区之间的数据进行交叉,反正不像同时完这10个分区数据这么快。

    4.2每个分区内数据的计算当成一个并行任务,每个并行任务包含一个计算链,每一个CPU核心就去执行这些计算连。直接,简单,干脆,不玩虚的,上代码理解计算链:

    rdd.map(line=>line.length).filter().等等之类的。 

    如果这些计算链之间都是独立的,而且互不影响,那么我们可以并行计算。我们可以将这些链条之间的关系定义为窄依赖(一对一依赖和范围依赖)

  2. RDD为什么要划分Stage,怎么划分stage?

    如果子RDD一个分区内的数据依赖于多个父RDD中分区的数据,这个叫做宽依赖,或者叫做Shuffle依赖,那么如果有多个子RDD,每个子RDD都依赖多个父RDD中分区的数据,我们是不是要想办法把RDD数据保存起来,提供给这些子分区计算使用,否则是不是每个分区都要重新计算多个父RDD数据,也在这个地方开始划分Stage的原因。凡是遇到宽依赖,就划分stage。

  3. Spark如何管理资源?

     

  4. Spark集群管理器分为三种,Standlone模式,Mesos模式,Yarn模式。这是重点,但又不是很重要,所以这地方不是十分了解,也没有多大损失。

  5. Spark内部如何调度?

    DAGScheduler是面向Stage的任务调度器,负责接收Spark应用提交的Job,根据RDD的依赖关系划分Stage,并提交Stage给TaskScheduler

    TaskScheduler是面向Task的任务调度器,它接受DAGScheduler提交过来的TaskSets,然后把一个个Task提交到Work结点运行,每个Executor运行什么Task也是在此处分配的。

    最重要的就是这张图了:

  6. 浅谈Spark内部运行机制

     (1)任何的Spark应用程序都包含Driver和Executor代码。Spark应用程序首先在Driver初始化SparkContext。因为SparkContext是Spark应用程序通往集群的唯一途径。在SparkContext里面包含了两个调度器,一个是DAGScheduler和TaskScheduler,在创建SparkContext对象的同时也自动创建了这两个类。

    浅谈火花内部运行机制