Impala查询卡顿分析案例+ 查看更多
Impala查询卡顿分析案例
+ 查看更多
Hadoop123:知名的大数据中台技术分享基地,涉及大数据架构(hadoop/spark/flink等),数据平台(数据交换、数据服务、数据治理等)和数据产品(BI、AB测试平台)等,也会分享最新技术进展,大数据相关职位和求职信息,大数据技术交流聚会、讲座以及会议等。
注:本文所用的Impala版本为3.4.0-SNAPSHOT。Impala由C++和Java写成,分别对应BE (Backend) 和 FE (Frontend) 两部分。
案例描述:
使用Alter Table语句新建一个partition时,查询一直不返回。在Coordinator网页上可以看到查询一直处于CREATED状态,且持续长达十几分钟:

这个查询设置了 sync_ddl=true,在忙碌的集群里是有可能十几分钟未完成的,但在我的测试环境里就不应该这样。
Alter Table Add Partition语句属于DDL,设置sync_ddl=true时,其执行流程如下:

图中各个步骤如下:
卡顿可能发生在上面任何一步中,需要从头开始排查。
查找卡顿源头
I. 找到Coordinator卡住的线程

输出的结果会比较长,如图所示:


使用Minidump替代Core Dump
使用要求
Impala版本不低于2.7:Impala 2.7(对应的CDH版本是cdh5.9)开始支持外界触发的Minidump,只需要给进程发送SIGUSR1信号。 编译对应版本的Impala源码:需要使用 Debug 模式编译才能保留所有符号信息(symbol),还需要使用toolchain中的breakpad工具来处理minidump。另外编译环境要跟线上环境一致,比如线上环境为ubuntu16.04,编译时也要找ubuntu16.04的机器来做。关于如何编译,可参考文档:https://cwiki.apache.org/confluence/display/IMPALA/Building+Impala
使用方法
1. 生成Minidump
Minidump文件并不包含任何符号信息,因此我们要自己生成Breakpad形式的符号信息来匹配上,这样我们才能看到函数名(而不只是函数地址)等等。
在编译Impala的目录(下称IMPALA_HOME)里,可以找到 bin/dump_breakpad_symbols.py,用它来生成breakpad形式的符号信息,假设说我们希望把符号信息存到 /tmp/syms,生成的文件大小是421MB,比Minidump文件还大一些,因为里面有各种文件名、函数名等。
3. 解析Minidump
使用Impala toolchain里的breakpad工具,假设对应的版本是 IMPALA_BREAKPAD_VERSION。中间会有刷屏的输出,只要最终解析成功就行了。
堆栈里同时也有代码的行号,感兴趣的朋友可以下载整个 resolved.txt 文件 (压缩后73KB) 研究研究:https://github.com/stiga-huang/BlogFiles/blob/master/Debugging%20on%20Stuck%20Query/resolved.txt.gz
在这之后就知道Coordinator是卡在等待ExecDdl的RPC返回了,后面同样可以对catalogd做分析。
总结
Impalad查询卡顿时,如果日志中无法发现异常,对于BE部分可以使用core dump或minidump来做线程堆栈分析,对于FE部分可以用jstack做分析。日志中的线程id对应gdb中的 LWP id 和 jstack 中的 nid (16进制),在minidump中找不到明显对应,可试图在寄存器值中匹配线程。
(注:BE是指Backend,主要是Impala的C++部分;FE是指Frontend,主要是Impala的Java部分)
指令回顾
- gcore [-o filename] pid
- gdb -c core_file program_binary
- gdb指令
- thread find thread_id (查找对应线程id在gdb中的线程编号)
- thread id (跳到对应编号的线程)
- bt (打印堆栈)
- jstack pid
- kill -s SIGUSR1 pid (触发impala进程生成minidump)
- $IMPALA_HOME/bin/dump_breakpad_symbols.py -f binaries -d output_symbol_dir (生成Breakpad形式的符号文件)
- $IMPALA_TOOLCHAIN/breakpad-$IMPALA_BREAKPAD_VERSION/bin/minidump_stackwalk $MINIDUMP_FILE $BREAKPAD_SYMBOLS > $RESULT_FILE (解析Minidump)
参考文档
- https://cwiki.apache.org/confluence/display/IMPALA/Debugging+Impala+Core+Dumps+on+Another+System
- https://cwiki.apache.org/confluence/display/IMPALA/Debugging+Impala+Minidumps
- https://cwiki.apache.org/confluence/display/IMPALA/Building+Impala
分享到: