首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Presto Profile系列】Timeline使用

【Presto Profile系列】Timeline使用

作者头像
skyyws
发布于 2022-09-01 07:16:05
发布于 2022-09-01 07:16:05
80800
代码可运行
举报
运行总次数:0
代码可运行

我们在Presto页面,可以通过“Splits”标签页查看整个查询的Timeline信息,如下所示:

本文,我们就从代码层面来看一下这个Timeline的相关内容,以及我们该如何使用它来排查一个查询的瓶颈点。

一、代码研究

简单来说,上面的Timeline展示的是stage与task相关的信息。这里我们首先看下每个task的taskId信息。

1.1 TaskId

我们可以直接在查询的详细页面上展开某个stage,然后就可以看到该stage下的所有task信息,如下所示:

每个task都有自己的一个ID,例如1.0.2,这个就是taskId,主要由两部分组成:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//SqlStageExecution.java
TaskId taskId = new TaskId(stateMachine.getStageExecutionId(), nextTaskId.getAndIncrement());

SqlStageExecution
-StageExecutionStateMachine stateMachine
--StageExecutionId stageExecutionId
---StageId stageId
---int id

对于上面的1.0.2,其中stageExecutionId是1.0,而nextTaskId是2。对于stageExecutionId而言,其中1就是stageId,而0则是id。StageExecutionId相关的代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//LegacySqlQueryScheduler.java
List<StageExecutionAndScheduler> sectionStages =
        sectionExecutionFactory.createSectionExecutions(
                session,
                section,
                locationsConsumer,
                bucketToPartition,
                outputBuffers,
                summarizeTaskInfo,
                remoteTaskFactory,
                splitSourceFactory,
                0).getSectionStages();

//SectionExecutionFactory.java
SqlStageExecution stageExecution = createSqlStageExecution(
        new StageExecutionId(stageId, attemptId),

可以看到,这个id是一个attemptId,默认是从0开始的,这里我们就暂时认为这个值在正常情况下都是0,相关代码不再深入展开。

1.2 Timeline相关成员

Timeline页面主要是由js的脚本来构造生成的,相关的代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//timeline.html
function renderTimeline(data) {
    function getTasks(stage) {
        return [].concat.apply(
                stage.latestAttemptExecutionInfo.tasks,
                stage.subStages.map(getTasks));
    }
    tasks = getTasks(data.outputStage);
    tasks = tasks.map(function(task) {
        return {
            taskId: task.taskId.substring(task.taskId.indexOf('.') + 1),
            time: {
                create: task.stats.createTime,
                firstStart: task.stats.firstStartTime,
                lastStart: task.stats.lastStartTime,
                lastEnd: task.stats.lastEndTime,
                end: task.stats.endTime,
            },
        };
    });

而这其中各个变量对应的Java类如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//作为整个Timeline的输入内容
QueryInfo data
-Optional<StageInfo> outputStage
//最终遍历处理每个TaskInfo
StageInfo stage
-StageExecutionInfo latestAttemptExecutionInfo
--List<TaskInfo> tasks
//循环处理outputStage的subStages中的每个<StageInfo
-List<StageInfo> subStages
//主要获取taskId进行分组、排序,stats中的几个time变量进行timeline展示
TaskInfo task
-TaskStats stats

1.3 Timeline阶段

在介绍Timeline的构造之前,先看一下timeline的几个节点,这里主要获取了每个task的五个阶段时间点,如下所示:

  1. Created
  2. First split started
  3. Last split started
  4. Last split ended
  5. Ended

从上一个时间点,到这个时间点之间,用一个颜色标识,作为一个阶段。一共四个阶段,如下所示:

  1. Created -> First split started:red
  2. First split started -> Last split started:green
  3. Last split started -> Last split ended:blue
  4. Last split ended -> Ended:orange

1.4 Timeline构造

服务端会根据上面的一些变量,然后通过js脚本来构造对应的变量,用于页面展示,相关代码如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//renderTimeline(timeline.html)
    var groups = new vis.DataSet();
    var items = new vis.DataSet();
    for (var i = 0; i < tasks.length; i++) {
        var task = tasks[i];
        var stageId = task.taskId.substr(0, task.taskId.indexOf("."));
        var taskNumber = task.taskId.substr(task.taskId.indexOf(".") + 1);
        if (taskNumber == 0) {
            groups.add({
                id: stageId,
                content: stageId,
                sort: stageId,
                subgroupOrder: 'sort',
            });
        }

首先就是获取stageId和taskNumber。例如对于1.0.2,分别就是1和0.2。处理stage的第一个task时,就将stage信息,加入到groups中。接着就开始处理这个task的各个阶段,以第一阶段为例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
items.add({
    group: stageId,
    start: task.time.create,
    end: task.time.firstStart,
    className: 'red',
    subgroup: taskNumber,
    sort: -taskNumber,
});

这里统计的就是task从create到第一个split start的时间,并表示为红色。遍历完成之后,所有的task都会被处理并放到items中。下面我们来看下groups和items两个成员的具体内容。

1.4.1 groups成员

通过直接在浏览器中对js进行调试,就可以看到groups的内容,如下所示:

由此可知,这个groups的成员就是对应的各个stage的id信息。

1.4.2 items成员

通过直接在浏览器中对js进行调试,同样可以看到items的信息,如下所示:

可以看到,每个task的每个阶段对应一个成员,例如task 1.0.16,它包含了四个成员,即group是1,subgroup是0.16,对应的分别就是stageId和taskNumber,这些成员的className不同,即不同的阶段,而sort则是-0.16,对应上面代码中的-taskNumber。

二、Timeline相关信息

介绍完Timeline的具体内容和代码实现之后,简单看下可以通过这个timeline获取哪些信息。

2.1 查看开始和结束时间

首先,可以通过缩放,来查看整个执行计划的概览:

此时,每一格代表的是5s,因此整个查询的时间范围大概是:6.24 17:16:25-6.24 17:16:45。如果我们再放大,就可以看到:

更精确的时间区间是:6.24 17:16:28-6.24 17:16:43。继续放大,然后双击鼠标,拖动整个timeline,就可以看到更加精确的时间:

此时可以看到,开始时间是:6.24 17:16:28.929,而结束时间则是:6.24 17:16:42.093,所以整个查询持续的时间大约是13.164s,与overview中的基本一致:

2.2 查看Stage分组

第二个重要的功能,就是查看stage信息。Timeline里面的每一个行代表一个task,下面会详细说到。首先会给task按照stage进行分组排序,排序是按照stageId进行的。我们可以通过纵坐标来查看stage信息:

可以看到,上面的timeline有两个stage,分别是0和1。这样我们就很容易看出来stage数量以及每个stage的task数量。

2.3 查看Stage的task

我们还可以通过timeline查看每个task的耗时信息。我们继续以上面的timeline为例,这个查询的完整task信息如下所示:

可以看到,有两个stage。stage0有1个task:0.0.0;stage1有18个task:1.0.0~1.0.17。其中,0.0.0和1.0.10这两个task的elapsed timed是最长的,都是13s多。因此,我们在timeline中看到的最长的两条线,就是对应的这两个task:

并且它们的大部分时间都是在第三阶段消耗的,即蓝色的部分,从Last split started到Last split ended。

2.3.1 Task顺序

从上面的items成员介绍可以得知,每个stage内部的task是按照-taskNumber进行排序的,因此我们上面几个task对应的顺序如下:

Task

顺序

1.0.0

-0

1.0.1

-0.1

1.0.2

-0.2

1.0.10

-0.1

1.0.11

-0.11

1.0.17

-0.17

这里需要注意的是1.0.1和1.0.10这两个task的sort值是一样的,都是-0.1。所以最终,上述Timeline的stage 1的task从上往下的顺序就是:

1.0.0 -> 1.0.10/1.0.1 -> 1.0.11 -> … -> 1.0.17 -> 1.0.2 -> … -> 1.0.9

结合上面详细的task图,我们得知:1.0.10耗时13.1s,1.0.2耗时554ms(相比其他task耗时比较长),这两个task正好位于timeline中的第二个(也可能是第三个)和中间部分:

三、Timeline使用小结

通过上面的介绍,我们可以得知,timeline主要展示了各个stage以其task的概览信息。因此,我们通常可以使用timeline获取如下的一些信息:

1)快速查看整个查询的瓶颈点位于哪个stage;

2)快速定位stage内部的task是否有skew;

3)通过task不同颜色的长短,迅速定位是哪个阶段的耗时占比高;

4)根据找到的慢task,再结合task的详细信息进行进一步的排查。

例如,对于下面这种图:

可以看到,最下面的stage(scan节点)存在部分task耗时明显很长,并且是蓝色线条,即Last split started到Last split ended。说明这些task的所有split中,至少有1个split耗时严重,此时我们就可以去查看这些task的详细信息了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
从 0 到 1 开发图书管理系统:飞算 JavaAI 让技术落地更简单
​​​​​​作为一名普通二本院校的计算机专业学生,我总在为简历上缺少亮眼的实战项目而焦虑。直到上个月接触到飞算 JavaAI,用它完成了图书管理系统的开发,不仅填补了简历空白,更让我对技术落地有了全新的认知。传统开发模式下,一个包含图书录入、借阅管理、用户权限的系统至少要耗掉一周时间,而这次借助飞算 JavaAI 的智能引导,从需求输入到完整上线仅用了一天半。今天就把这份从 0 到 1 的开发经历分享出来,希望能给同样迷茫的技术学习者一点启发。​
Pocker_Spades_A
2025/08/08
730
从 0 到 1 开发图书管理系统:飞算 JavaAI 让技术落地更简单
MapReduce推测机制及自定义推测机制
作者:wyattliu  腾讯TEG工程师 |导语 集群中的机器机型、负载并不一定完全相同,所以即使一个MapReduce任务每一个Map/Reduce task要处理的数据量完全相同,其运行时间也可能会相差很大。推测机制就是为了缓解这种问题而设计的。但是针对不同的任务,默认的推测机制并不总能产生预期的效果。本文主要分析了MapReduce在演进过程中使用到的推测机制的利弊,以及介绍如何根据需求定制推测机制。 01 MapReduce推测机制 这篇文章 Hadoop的任务推测执行算法 @Hazza Ch
腾讯大讲堂
2021/02/04
1.4K0
[spark] TaskScheduler 任务提交与调度源码解析
在DAGScheduler划分为Stage并以TaskSet的形式提交给TaskScheduler后,再由TaskScheduler通过TaskSetMagager对taskSet的task进行调度与执行。
UFO
2018/09/04
1.1K0
【Dr.Elephant中文文档-6】度量指标和启发式算法
我们将作业的资源使用量定义为任务容器大小和任务运行时间的乘积。因此,作业的资源使用量可以定义为mapper和reducer任务的资源使用量总和。
一条老狗
2019/12/26
1.4K0
3万字史诗级 Hive 性能调优(建议收藏)
Hive 作为大数据领域常用的数据仓库组件,在平时设计和查询的时候要特别注意效率 。影响 Hive 效率的几乎从不是数据量过大,而是数据倾斜、数据冗余、Job或I/O过多、MapReduce 分配不合理等等。 对Hive 的调优既包含 Hive 的建表设计方面,对 HiveHQL 语句本身的优化,也包含 Hive 配置参数 和 底层引擎 MapReduce 方面的调整 。
肉眼品世界
2022/06/15
5.4K1
3万字史诗级 Hive 性能调优(建议收藏)
一步一步理解 Impala query profile(三)
在本博客系列的第3部分,我将仍然关注查询计划(Query Plan)和执行摘要(Execution Summary),但是将使用真实数据(Kaggle’s Flights Delay database),来执行一个更复杂的查询。
九州暮云
2019/12/16
1.7K0
由浅入深了解Presto技术内幕
Presto是专为大数据实时查询计算而设计开发的产品,拥有如下特点: – 多数据源:通过自定义Connector能支持Mysql,Hive,Kafka等多种数据源 – 支持SQL:完全支持ANSI SQL – 扩展性:支持自定义开发Connector和UDF – 混合计算:可以根据需要将开源于不同数据源的多个Catalog进行混合join计算 – 高性能:10倍于Hive的查询性能 – 流水线:基于Pipeline设计,在数据处理过程当中不用等到所有数据都处理完成后再查看结果
大数据真好玩
2020/06/03
3.5K0
大数据平台:计算资源优化技术&作业诊断
大数据平台的资源管理组件主要针对存储资源与计算资源进行分析优化。前文《大数据平台:资源管理及存储优化技术》主要介绍了存储资源优化,本文主要介绍大数据平台构建过程中,计算资源相关的优化技术。
Yiwenwu
2024/05/03
8560
大数据平台:计算资源优化技术&作业诊断
【Hive】hive 数据倾斜、优化策略、hive执行过程、垃圾回收
group by和聚合函数(sum count max min)一起使用 group by和以上的聚合函数一起使用的时候会默认在map端执行一次combiner(局部聚合:减少reducetask的数据量,这个时候reduce端接受的数据就会大大减少 一般不会出现数据倾斜 select id,count(*) from course group by id;
从大数据到人工智能
2022/09/16
1.9K0
【Hive】hive 数据倾斜、优化策略、hive执行过程、垃圾回收
Hive计算引擎大PK,万字长文解析MapRuce、Tez、Spark三大引擎
Hive从2008年始于FaceBook工程师之手,经过10几年的发展至今保持强大的生命力。截止目前Hive已经更新至3.1.x版本,Hive从最开始的为人诟病的速度慢迅速发展,开始支持更多的计算引擎,计算速度大大提升。
王知无-import_bigdata
2021/10/27
4.1K0
Presto架构原理与优化介绍 | 青训营笔记
关于大数据概念,这里参考马丁·希尔伯特的总结:大数据其实是在2000年后,因为信息化的快速发展。信息交换、信息存储、信息处理三个方面能力的大幅增长而产生的数据。
鳄鱼儿
2024/05/21
2650
Presto架构原理与优化介绍 | 青训营笔记
【源码解读】| LiveListenerBus源码解读
异步事件列队主要由LinkedBlockingQueue[SparkListenerEvent] 构建,默认大小为10000
857技术社区
2022/07/07
1.7K0
【源码解读】| LiveListenerBus源码解读
一篇文章让你了解Hive调优
老工在职场多年,从事过海量(PB级)数据的关系型数据库数据处理工作,后由于数据平台升级的要求,将数据迁移到Hadoop集群,做了多年的数据研发和数据产品的研发工作,从业务理解、数据模型构建、数据采集、数据清洗,到数据产品前端/服务端的研发都做过,基本涵盖了数据的生命周期。对于Hive调优,老工自有一番理解。下面将从一个过度优化的案例说起。
Fayson
2020/02/27
2.2K0
一篇文章让你了解Hive调优
Spark内核详解 (5) | Spark的任务调度机制
在上一篇博文中我们讲解了 Spark YARN-Cluster 模式下的任务提交流程,但是我们并没有具体说明 Driver 的工作流程, Driver 线程主要是初始化 SparkContext对象,准备运行所需的上下文,然后一方面保持与ApplicationMaster的RPC连接,通过ApplicationMaster申请资源,另一方面根据用户业务逻辑开始调度任务,将任务下发到已有的空闲Executor上。
不温卜火
2020/10/28
3.7K0
Spark内核详解 (5) | Spark的任务调度机制
五万字 | Hive知识体系保姆级教程
Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。
数据社
2021/08/27
2.3K0
五万字 | Hive知识体系保姆级教程
Presto原理&调优&面试&实战全面升级版
很久之前,曾经写过一篇 《Presto在大数据领域的实践和探索》 。文中详细讲解了Presto的原理和应用。
王知无-import_bigdata
2021/07/12
2.3K0
Presto原理&调优&面试&实战全面升级版
Impala profile相关参数介绍(一)
Impala原生提供了每个SQL执行过程中的profile信息,profile里面有很多的参数可以供我们参考,来排查SQL执行过程中遇到的各种问题。由于目前官方没有对这些参数进行一一解释,因此本文旨在通过阅读代码的方式,来介绍一些在实际使用过程中碰到的参数,希望对大家有所帮助。首先要介绍的是如下所示的几个参数:
skyyws
2022/05/20
8770
Elasticsearch运维指南
地址: https://www.elastic.co/guide/en/kibana/current/xpack-monitoring.html
雨夜v1
2021/06/17
3.1K0
Elasticsearch运维指南
Presto Web UI
每个 Presto 服务都会提供一个 Web 界面,通常称为 Presto Web UI。可以使用与 Presto 服务器相同地址和 HTTP 端口号来访问 Presto Web UI。默认情况下,端口为 8080。例如,http://presto.example.com:8080。Presto Web UI 可在每个 Presto 的 Coordinator 上访问,并可用于检查和监控 Presto 集群以及已处理的查询。
smartsi
2020/08/04
6.3K0
Presto Web UI
一脸懵逼学习Hive的使用以及常用语法(Hive语法即Hql语法)
该文介绍了关于数据库连接池的知识点,包括概念、特点、配置方式、调优参数和常见问题。同时,文章还提供了如何正确配置和优化数据库连接池的相关建议,以帮助开发人员更好地掌握和应用该技术。
别先生
2018/01/02
3.7K0
一脸懵逼学习Hive的使用以及常用语法(Hive语法即Hql语法)
相关推荐
从 0 到 1 开发图书管理系统:飞算 JavaAI 让技术落地更简单
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档