每个 Presto 服务都会提供一个 Web 界面,通常称为 Presto Web UI。可以使用与 Presto 服务器相同地址和 HTTP 端口号来访问 Presto Web UI。默认情况下,端口为 8080。例如,http://presto.example.com:8080
。Presto Web UI 可在每个 Presto 的 Coordinator 上访问,并可用于检查和监控 Presto 集群以及已处理的查询。
当你第一次使用 Presto Web UI 时,你会看到如下图所示的页面。顶部展示了 Presto 的集群信息,底部展示了查询列表。这些信息对于操作 Presto 以及管理正在运行的查询都具有巨大的价值:
我们首先看一下 Presto 的集群信息:
Presto Web UI 页面底部展现了最近运行的查询,如下图所示:
查询列表中展示的查询个数取决于 Presto 集群配置。如上图所示我们可以通过查询控件来搜索我们要展示的查询。毕竟在集群非常繁忙时,数十或数百个查询会同时运行。可以在查询控件中键入我们要搜索查询的条件,可以是查询启动器的用户名,查询来源,查询ID,资源组,或者查询 SQL 文本以及查询状态。
查询控件旁边的 State 过滤器可以让我们基于查询状态:Running(运行中)、Queued(排队中)、Finished(已完成)、Failed(失败)来选择或排除某些查询。Failed 状态还可以再细分为具体失败原因:内部错误,外部错误,资源错误,或者用户错误。最左边的控件可以让我们决定查询的排序顺序、重新排序的时间以及要展示查询最大数量。查询控件下面每一行都代表一个查询。每行的最左列展示查询有关信息。最右列展示查询 SQL 文本以及查询状态,如下图所示查询摘要示例:
我们来看一下每个查询的详细信息。最上面一行左侧内容是查询ID。在这个示例中,查询ID为 20200802_061008_00003_tccrc。我们可能会注意到查询ID的开头由日期和时间(UTC)组成,并使用 YYYYMMDD_HHMMSS 的时间格式。后半部分是查询的增量计数器,计数器 00003 表示这是自 Coordinator 启动以来运行的第3个查询。最后一部分 tccrc 是 Coordinator 的随机标识符。如果重新启动 Coordinator,随机标识符和计数器也都会重置。右上角的时间是运行查询的本地时间。
下面三个值 smartsi,presto-cli 以及 global 分别表示运行查询的用户,查询来源以及运行查询的资源组。在此示例中,用户默认为 smartsi,我们通过 presto-cli 来提交查询。如果在运行 Presto CLI 时指定 –user 标志,那么显示的用户将更改为我们指定的值。提交查询来源也可以不是 presto-cli,例如,当应用程序使用 JDBC 驱动程序连接到 Presto 时,提交查询来源会显示为 presto-jdbc。客户端还可以使用 Presto CLI 的 –source 标志以及 JDBC 连接字符串属性将其设置为任何所需的值。
下面我将介绍最后几行标示的具体含义,它们包含了查询的一些重要信息:
接下来,我们了解一下有关查询处理的不同状态,这些状态显示在查询语句上方,如下图所示:
最常见的状态有:RUNNING(运行中),FINISHED(完成),USER CANCELLED(用户已取消)或 USER ERROR(用户错误)。USER CANCELED 表示查询已被用户杀死,USER ERROR 表示用户提交的 SQL 查询语句包含语法或语义错误。
当正在运行的查询等待资源或其他 Split 去处理时被阻塞,就会发生 BLOCKED 状态。看到查询反复出现这种状态也是正常的。但是,如果查询卡在这种状态下,这就意味着查询或 Presto 集群有问题。如果发现查询卡在这种状态,首先检查使用的内存以及系统配置。查询可能需要非常高的内存或者计算量很大。此外,如果客户端没有返回结果或无法足够快地读取结果,则这种背压会使查询进入 BLOCKED 状态。
我们可能还会看到查询处于 PLANNING 状态。对于较大,复杂的查询,通常会发生这种情况,这种查询需要生成大量查询计划和优化才能运行查询。如果经常看到这种情况,似乎要花费大量时间为查询生成查询计划,则应调查可能的原因,例如可用内存是否不足或 Coordinator 的处理能力。
到目前为止,我们已经看到有关 Presto 集群的整体信息以及查询的高级别信息。Web UI 还为每个查询提供了更多的详细信息。只需单击某个查询,即可访问查询详情页面。查询详情页面有几个 Tab 可以供我们查看 Presto 查询的更多详细信息,如下图所示:
概述页面包括如下几个方面:
如下图所示 Stages 部分展示了查询 Stages 的信息:
这个特定的查询是 SELECT * FROM dws_app_pub_region_device_td limit 10
查询语句。因为它是一个比较简单的查询,所以只有两个 Stage。Stage 0 是运行在 Coordinator 上的单任务 Stage,负责合并 Stage 1 中任务的结果并执行最终聚合。Stage 1 是一个运行在不同 Works 上的分布式 Stage。该 Stage 负责读取数据并计算部分聚合。
下面我们看看 Stage 中一些有用的数值:
如下图所示展示了 Task 更多详细信息:
让我们下面看看 Task 列表中:
列 | 说明 |
---|---|
ID | Task 标识符,格式为 stage-id.task-id。例如,ID:0.0 表示 Stage 0 的 Task 0,ID:1.2 表示 Stage 1 的 Task 2。 |
Host | Task 运行在 Worker 节点的IP地址。 |
State | State 的状态,可以是 PENDING,RUNNING, 或者 BLOCKED。 |
Pending Splits | Task 等待处理的 Split 的个数。 |
Running Splits | Task 正在处理的 Split 的个数。这个值会随着 Task 的运行而改变。Task 运行完成,此值变为0。 |
Blocked Splits | Task 被阻塞的 Split 的个数。这个值会随着 Task 的运行而改变。Task 运行完成,此值变为0。 |
Completed Splits | Task 已经完成的 Split 的个数。这个值会随着 Task 的运行而改变。Task 运行完成,此值等于总 Split 个数。 |
Rows | Task 已处理的行数。这个值会随着 Task 的运行而增加。 |
Rows/s | Task 每秒处理的行数。 |
Bytes | Task 已处理的字节数。这个值会随着 Task 的运行而增加。 |
Bytes/s | Task 每秒处理的字节数。 |
CPU Time | Task 调度花费的总CPU时间。 |
Buffered | 当前等待处理时缓冲的数据量。 |
Live Plan 页面中我们可以实时查看查询执行处理过程,如下图所示:
查询执行过程中,Plan 中的计数器会随着查询执行的进度而更新。Plan 中的值与概述(Overview)页面中描述的值相同,唯一不同的是在查询执行计划上实时展现。查看此视图有助于可视化查询卡在哪里或在哪里花费大量时间,以便诊断或改善性能问题。
Stage 性能页面在查询处理结束之后会提供 Stage 性能的详细可视化视图,如下图所示。该视图可以认为是 Live Plan 视图的向下钻取,我们可以在其中看到 Stage 中 Task 的算子流水线。Plan 中的值与概述(Overview)页面中描述的值相同。查看此视图有助于查看查询卡在哪里或在哪里花费大量时间,以便诊断或解决性能问题。我们可以单击每个单独的算子来查看详细信息:
Split 页面展示了在查询执行期间创建和处理 Split 的时间线:
JSON 页面以 JSON 格式提供所有查询的详细信息。这些信息会根据其检索的快照进行更新:
翻译来自《Presto权威指南》