【问题标题】:Get application id from hive log for given query从配置单元日志中获取给定查询的应用程序 ID
【发布时间】:2018-07-26 04:11:48
【问题描述】:
在我们的环境中,我们有许多用户从不同的工具发出 Hive 查询。很多时候用户会给我们一个查询,说它在某个时间左右失败,我们需要挖掘并找到原因。
所以我们需要解析 hive 日志并找到查询。
查找查询是比较容易的部分,有没有办法在 hive 日志中找到查询后(通常在执行命令之后),如何轻松获取与之关联的 yarn 应用程序 ID?
我正在尝试自动化这个过程,以便缩短分析时间。
谢谢
【问题讨论】:
标签:
hadoop
hive
hadoop-yarn
【解决方案1】:
您可以做的一件事是,您可以使用yarn application -list -appStates ALL 命令。它的作用是,它将为您提供所有应用程序的列表以及它们各自的应用程序 ID、名称、用户、状态、跟踪 url 等。因此您可以深入了解您需要的内容。您甚至可以指定状态,例如您需要哪些状态数据:- yarn application -list -appStates FINISHED 将显示所有状态为已完成的记录。
【解决方案2】:
不是一个完整的答案,但它可以帮助您入门。
您可以查看时间线服务器休息 API,也可以查看资源管理器 API,而不是查看配置单元日志。从那时起,您应该能够获得查询列表和应用 ID。
如果您使用的是 Hortonworks,请查看 Tez 视图。它显示查询和应用程序 ID。查看浏览器的开发人员工具实际发生的情况有助于了解 API 调用的流程。我对 Cloudera 或 MapR 不够熟悉,不知道该去哪里看。
此选项的优点是它可以远程完成,并且可以更优雅地处理 HA,因为它不需要直接在您的 Hive 服务器上运行
【解决方案3】:
我实际上找到了一种方法来做到这一点。有几个步骤
-
我有一个跟踪日志文件的脚本。这样做的原因是为了去掉SQL语句中的回车。我会把它放在底部,但基本上只是在 /opt/mapr/hive/hive-2.3/logs/mapr/mapr-hiveserver2-*.log 上做 tail 并寻找“执行命令”。 (我相信你已经这样做了)。例如,我得到这个:
2021-01-21T15:43:21,836 INFO [HiveServer2-Background-Pool: Thread-4024376] ql.Driver: Executing command(queryId=mapr_20210121154321_abfc0235-571f-44dd-961c-521064c8d163): SELECT COUNT(*) FROM prod.statsman WHERE dt = '20210101' AND oid like 'qos.8%'
-
现在获取 queryId 并 grep 查询 id 和“提交 dag 到 TezSession”的相同文件。从这里你可以找到你的application_id
cat /opt/mapr/hive/hive-2.x/logs/mapr/mapr-hiveserver2-*.log | grep mapr_20210121154321_abfc0235-571f-44dd-961c-521064c8d163 | grep "Submitting dag to TezSession"
2021-01-21T15:43:21,952 INFO [HiveServer2-Background-Pool: Thread-4024376] client.TezClient: Submitting dag to TezSession, sessionName=HIVE-bd39c7da-7041-4fff-ab51-9d0bac18178e, applicationId=application_1607034625968_103472, dagName=SELECT COUNT(*) FROM prod.statsma...'qos.8%'(Stage-1), callerContext={ context=HIVE, callerType=HIVE_QUERY_ID, callerId=mapr_20210121154321_abfc0235-571f-44dd-961c-521064c8d163 }
注意:为了跟踪日志文件,我将此 perl 代码创建为 stripcrlf.pl
#!/usr/bin/perl
use strict;
use warnings;
while(<>) {
my $line = $_;
$line =~ s/\r\n/ /g;
print $line;
}
然后这是尾日志文件
tail -f /opt/mapr/hive/hive-2.x/logs/mapr/mapr-hiveserver2-*.log | ./stripcrlf.pl | grep "Executing command" | grep -viP "show partitions|describe |analyze table|show schemas|create external|desc "
grep -viP 是可选的,我添加它是因为我们有一个运行大量此类命令的进程。