作者:Eric Lin (林晨辉), Cloudera高级售后技术支持工程师。毕业于Monash大学计算机科学, Sir John Monash的奖学金获得者。曾就业于数据收集公司如Hitwise(现为Experian的子公司)和Effective Measure,担任高级工程师,负责设计,开发和管理用于采集, 处理和报告网络数据的平台(基于PHP,Java和CDH)。现任职Cloudera, 担任高级售后技术支持工程师,主要擅长解决在CDH生态系统中出现的各种疑难杂症。
很多Impala用户不知道如何阅读Impala query profile来了解一个查询背后正在执行的操作,从而在此基础上对查询进行调优以充分发挥查询的性能。因此我想写一篇简单的文章来分享我的经验,并希望它可以对希望了解更多信息的人有所帮助。
这是本系列的第1部分,我将介绍一些Impala query profile的基础知识和查看Profile时特别要注意的内容。
获取Impala query profile
首先,获取Impala query profile有两种方法,最简单的方法是在impala-shell中运行查询后执行“PROFILE”语句,如下所示:
代码语言:javascript复制[impala-daemon-host.com:21000] > SELECT COUNT(*) FROM sample_07;
Query: SELECT COUNT(*) FROM sample_07
Query submitted at: 2018-09-14 15:57:35 (Coordinator: https://impala-daemon-host.com:25000)
dQuery progress can be monitored at: https://impala-daemon-host.com:25000/query_plan?query_id=36433472787e1cab:29c30e7800000000
----------
| count(*) |
----------
| 823 |
----------
Fetched 1 row(s) in 6.68s
[impala-daemon-host.com:21000] > PROFILE; <-- Simply run "PROFILE" as a query
Query Runtime Profile:
Query (id=36433472787e1cab:29c30e7800000000):
Summary:
Session ID: 443110cc7292c92:6e3ff4d76f0c5aaf
Session Type: BEESWAX
.....
也可以在CDH的Web页面(Cloudera Manager Web UI)上点击CM > Impala > Queries,找到刚刚运行的查询,然后点击Query Details:
接着向下滚动找到“Download Profile”按钮:
你也可以到执行查询的Impala Daemon(impalad节点,该节点在Impala集群中为coordinator角色)节点的Web界面来下载query profile信息:
代码语言:javascript复制https://{impala-daemon-url}:25000/queries
该Web界面会展示出在当前Impala Daemon节点执行的SQL列表:
然后点击对应SQL后的“Details”链接转到“Profile” tab页:
获取了Profile之后,接下来我们开始剖析Profile。
Profile解析
下面是Query Profile的一段文本,该段文本是Profile最上面的概要(Summary)部分:
代码语言:javascript复制Query (id=36433472787e1cab:29c30e7800000000):
Summary:
Session ID: 443110cc7292c92:6e3ff4d76f0c5aaf
Session Type: BEESWAX
Start Time: 2018-09-14 15:57:35.883111000
End Time: 2018-09-14 15:57:42.565042000
Query Type: QUERY
Query State: FINISHED
Query Status: OK
Impala Version: impalad version 2.11.0-cdh5.14.x RELEASE (build 50eddf4550faa6200f51e98413de785bf1bf0de1)
User: hive@VPC.CLOUDERA.COM
Connected User: hive@VPC.CLOUDERA.COM
Delegated User:
Network Address: ::ffff:172.26.26.117:58834
Default Db: default
Sql Statement: SELECT COUNT(*) FROM sample_07
Coordinator: impala-daemon-url.com:22000
Query Options (set by configuration):
Query Options (set by configuration and planner): MT_DOP=0
Plan:
----------------
我们将其分为几个部分来介绍,这里面有一些频繁用到的重要信息:
1、查询ID:
代码语言:javascript复制Query (id=36433472787e1cab:29c30e7800000000):
该ID唯一标识在Impala中运行过的SQL,这对于从Impala Daemon日志中用ID查询相关的信息很有用,只需搜索此查询ID,就可以了解SQL运行细节和相关的错误信息。
2、Session类型:
代码语言:javascript复制Session Type: BEESWAX
这可以告诉我们连接来自哪里。BEESWAX意味着查询是从impala-shell客户端运行的。如果从Hue运行,类型将是HIVESERVER2,因为Hue是通过HIVESERVER2 thrift连接的。
3、查询起止时间:
代码语言:javascript复制Start Time: 2018-09-14 15:57:35.883111000
End Time: 2018-09-14 15:57:42.565042000
这可以告诉我们查询运行了多长时间,此时间包括会话空闲时间(session idle time)。因此,如果你看到在Hue运行一个简单的查询用了几秒钟返回结果,是由于Hue会保持会话打开直到会话关闭或用户运行另一个查询,因此此处的时间可能比正常显示的时间更长。如果通过impala-shell运行,则开始时间和结束时间应与运行时间完全匹配,因为impala-shell在查询完成后会立即关闭查询处理程序。
4、查询状态:
代码语言:javascript复制Query Status: OK
这表明查询是否成功完成。OK表示查询成功执行完成。如果有错误,通常会在此处显示,例如,被用户取消(cancelled by user)、会话超时(session timeout)、异常(Exceptions)等。
5、Impala版本:
代码语言:javascript复制Impala Version: impalad version 2.11.0-cdh5.14.x RELEASE (build 50eddf4550faa6200f51e98413de785bf1bf0de1)
该信息显示运行查询的Impala版本,如果你发现它与你安装的Impala版本不匹配,则说明未正确安装某些部分。
6、运行查询的用户信息:
代码语言:javascript复制User: hive@XXX.XXXXXX.COM
Connected User: hive@XXX.XXXXXX.COM
Delegated User:
该信息表示运行查询的用户。
7、查询所用的数据库:
代码语言:javascript复制Default Db: default
该信息表示查询所使用的数据库。
8、查询语句:
代码语言:javascript复制Sql Statement: SELECT COUNT(*) FROM sample_07
如果你帮助其他人排查问题,则需要此信息,因为需要了解查询的构造方式以及涉及的表,在许多情况下,对查询的简单重写将有助于解决问题或提高查询性能。
9、执行查询的impalad节点:
代码语言:javascript复制Coordinator: impala-daemon-host.com:22000
该信息显示运行查询的Impala daemon服务的主机,通常被称为Coordinator,这有助于我们选择从哪个主机查找INFO、WARNING和ERROR级别的日志。
10、查询选项:
代码语言:javascript复制Query Options (set by configuration):
Query Options (set by configuration and planner): MT_DOP=0
该信息显示当前查询使用了哪些查询选项(QUERY OPTIONS),这有助于我们判断是否在用户级别(user level)或池级别(pool level)覆盖了查询选项。一个示例是将Impala Daemon的内存设置为120GB,但小查询仍然失败,并抛出OutOfMemory异常,通过该信息可以帮助我们验证用户是否在会话中将MEM_LIMIT参数设置了太小的值(可能导致OutOfMemory异常)。
总结
本系列的第1部分介绍了查询的摘要(Summary)部分以帮助我们了解Query Profile的基本信息,在本系列的下一部分,将详细介绍查询计划以及Profile的执行摘要(Execution Summary)部分。
英文以及中文翻译原文如下:
代码语言:javascript复制https://www.ericlin.me/2018/09/impala-query-profile-explained-part-1/
https://my.oschina.net/dabird/blog/3138749