在我们的env中,我们有许多用户从不同的工具发出配置单元查询。很多时候,用户会给我们一个查询,说在某个时间左右失败了,我们需要深入了解并找到原因。因此,我们需要解析配置单元日志并找到查询。
查找查询是更容易的部分,有没有一种方法可以很容易地弄清楚,一旦在配置单元日志中找到查询(通常在单词Executing command之后(,我如何轻松地获得与之关联的yarn应用程序id?
我正在努力使这个过程自动化,这样我就可以减少我们的分析时间。
感谢
您可以使用yarn application -list -appStates ALL
命令。它的作用是,它会给你所有应用程序的列表,以及它们各自的应用程序id、名称、用户、状态、跟踪url等。所以你可以深入了解你需要什么。您甚至可以指定状态,比如您需要哪个状态数据,例如:-yarn application -list -appStates FINISHED
将显示状态为已完成的所有记录。
不是一个完整的答案,但它可以帮助您开始。
您可以查看timeline服务器rest API,也可以查看资源管理器API,而不是查看配置单元日志。从那时起,您应该能够获得查询列表和应用程序id。
如果您正在使用Hortonworks,请查看Tez视图。它显示查询和应用程序id。查看浏览器的开发工具实际发生了什么可以帮助ge API调用的流程。我对Cloudera或MapR不够熟悉,不知道在哪里看。
此选项的优点是,所有操作都可以远程完成,并且可以更优雅地处理HA,因为它不需要直接在您的蜂窝服务器上运行
我实际上找到了一种方法。有几个步骤
-
我有一个跟踪日志文件的脚本。这样做的原因是去掉SQL语句中的回车。我会把它放在底部,但基本上只是在/opt/mapr/hive/hive-2.3/logs/mapr/mapr-hiveserver2-*.log上做尾部操作;执行命令";。(我相信你已经做到了(。例如,我得到的是:
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并为查询id grep相同的文件;向TezSession提交dag";。从中可以找到您的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/rn/ /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是可选的,我添加它是因为我们有一个运行大量此类命令的进程。