TDH中inceptor监控界面详解-task、core、stage关系

inceptor监控界面说明


  1. job监控界面
  • jobs 代表单独的sql job,一个sql进来之后会形成一个job,下面显示的有正在执行的job,完成的job,失败的job
  • stages 代表阶段,一个sql进来之后会拆分成不同的阶段来执行,这里涉及到spark的知识,下面会讲到
  • username 提交的用户名是谁
  • submission 提交时间
  • duration (total tasktime)总共job执行完成耗时
  • stages:succeed/total 阶段中成功和总共数量
  • tasks:succeed/total 任务中成功和总共数量,这里task代表任务,是stages执行sql过程需要用到多少个任务数量

 2. stages监控界面

  • Furion Scheduler代表inceptor内部调度算法,FIFO 先进先出,FAIR 公平调度
  • cores 代表集群inceptor一共有多少个cores能用,这里显示是80个
  • active stages 正在执行的stages
  • completed stages 完成的stages
  • shuffle 产生shuffle阶段文件大小
  • 点击连接进入可以看到如下界面代表task执行情况,主要是只占用时间,在哪些节点上执行的等等

task、core、executor、节点关系


1. inceptor执行sql之后会转化成spark任务,我们知道到spark的执行原理来分析,下面给出原理流程

  1. 输入可能以多个文件的形式存储在HDFS上,每个File都包含了很多块,称为Block
  2. 当Spark读取这些文件作为输入时,会根据具体数据格式对应的InputFormat进行解析,一般是将若干个Block合并成一个输入分片,称为InputSplit
  3. 随后将为这些输入分片生成具体的Task。InputSplit与Task是一一对应的关系
  4. 随后这些具体的Task每个都会被分配到集群上的某个节点的某个Executor去执行

2. 看到这里我们可能有很多不清楚的地方

  • 什么是block?可以理解为存在hdfs上的文件,256M为一个块是hdfs的核心知识;
  • 什么是inputsplit?可以理解为将这些block做一次输入和切分,这样才能进行读取,进行合理切分,否则数据读取很难处理
  • 每个Task执行的结果就是生成了目标RDD的一个partiton,什么是RDD?RDD是一个不可变的分布式对象集合,每个RDD都被分为多个分区,分区是spark中数据集的最小单位。也就是说spark当中数据是以分区为单位存储的,不同的分区被存储在不同的节点上。spark一个重要的理念。即移动数据不如移动计算,也就是说在spark运行调度的时候,会倾向于将计算分发到节点,而不是将节点的数据搜集起来计算。RDD正是基于这一理念而生的,它做的也正是这样的事情。

3. 关系

  • 一个节点上可以启动多个executor,每个Executor由若干core组成,每个Executor的每个core一次只能执行一个Task;
  • 这里的core是虚拟的core而不是机器的物理CPU核,虚拟core《=物理的core;
  • Task被执行的并发度 = Executor数目 * 每个Executor核数,这里是80个core,也就是并发80个task,也就是占用80个core,这样理解;
 
1.也就是说如果文件太大,比如历史表数据,block也就有很多,导致task就比较多,有时候会上万个task在执行,运行起来就比较慢,导致其他任务等待资源;
2.spark调优,为什么有时候说block是200M最优:核心思想是同时用所有的task数量,而且不是拆分的越多越好,最优是200M
  • RDD在计算的时候,每个分区都会起一个task,所以rdd的分区数目决定了总的的task数目。
  • 申请的计算节点(Executor)数目和每个计算节点核数,决定了你同一时刻可以并行执行的task。
  • 比如的RDD有100个分区,那么计算的时候就会生成100个task,你的资源配置为10个计算节点,每个两2个核,同一时刻可以并行的task数目为20,计算这个RDD就需要5个轮次。
  • 如果计算资源不变,你有101个task的话,就需要6个轮次,在最后一轮中,只有一个task在执行,其余核都在空转。
  • 如果资源不变,你的RDD只有2个分区,那么同一时刻只有2个task运行,其余18个核空转,造成资源浪费。这就是在spark调优中,增大RDD分区数目,增大任务并行度的做法。

4.inceptor中executor经常出现warning告警

       ---现象是inceptor中节点会出现worker节点批量告警,发现正在运行的sql比较多,导致集群内存溢出,原因如下:

  • 一台机器的内存分配给越多的executor,每个executor的内存就越小,因为每个机器的内存是固定的,以致出现过多的数据spill over甚至out of memory的情况;

5.task出现skipped

  • 不是报错,而是spark已经将数据装载在内存中,直接读取的内存数据,就会跳过task任务执行,速度就很快

spark中提供了两种方式来创建RDD,一种是读取外部的数据集,另一种是将一个已经存储在内存当中的集合进行并行化。这里就是存储在了内存

 

 

随后将为这些输入分片生成具体的Task。InputSplit与Task是一一对应的关系

posted @ 2022-03-03 15:36  Tim&Blog  阅读(175)  评论(0编辑  收藏  举报