> 文章列表 > Impala事故处理手册

Impala事故处理手册

Impala事故处理手册

Impala事故处理手册

本文不是事故原因汇总,只介绍当Impala集群出现事故时的处理流程,以最大限度保留现场信息,方便事后调查。第一节介绍故障表现和对应的操作建议,第二节介绍每个操作的具体执行流程。本文将不定期更新,欢迎留言反馈具体的故障场景。

1. 故障表现

1.1 大量查询处于CREATED状态

如果coordinator有大量 “waiting for metadata” 的日志,挑几个提及的表去查catalogd日志,结合jstack分析。
如果CREATED状态的大部分是DDL/DML,也是查catalogd日志,结合jstack分析。

定位不了问题可以关闭可疑的表对应的application,收集profile、coordinator和catalogd日志以及catalogd的jstack,重启catalogd。

1.2 Catalog Server OOM

首先要排除假的OOM,即内存够用,但日志里显示OOM错误,报错一般从 ByteArrayOutputStream.hugeCapacity 或类似的函数抛出。这类是因为申请了超过2GB的byte array,需要优化对应大表的元数据,不属于本条事故类型。

排除是申请超过2GB byte array报的OOM后,收集catalogd的jstack、jmap heap dump,时间来得及的话收集内存使用直方图信息,最后提高Xmx重启catalogd。

如果是类似的JVM内存问题,如频繁Full GC,也适用本条。

1.3 Impalad crash

如果是CM管理的集群,一般会自动重启impalad。在图表里有Unexpected Exit会显示多少台挂了。

备份日志(包括所有coordinator和crash的executor)、minidump文件、CM图表里相关的Impala图表。

2. 操作汇总

2.1 收集jstack

Catalog Server (catalogd) 和 Impalad 都有 JVM,当出现服务卡死或响应很慢时,需要收集jstack信息。使用和进程所用jdk对应的jstack,并且切换到进程所用的username来操作。比如CM管理的Impala服务,都是用 “impala” 这个用户名来启动的,jstack操作示例:

export JAVA_HOME=/usr/java/jdk1.8.0_232-cloudera
export PATH="$JAVA_HOME/bin:$PATH"
sudo -E -u impala jstack $(pidof catalogd) > catalogd.jstack.txt

若无响应或失败,增加 -F 参数:

sudo -E -u impala jstack -F $(pidof catalogd) > catalogd.jstack.txt

如果服务不是卡死,可循环采集多轮,如

while true; do sudo -E -u impala jstack $(pidof catalogd) >> catalogd.jstack.txt; done

注:如果是服务响应慢(性能问题),打jstack时尽量不要加 -l (小写L) 或 -F 参数,因为会显著增加JVM pause的时间。观察日志里的JvmPauseMonitor信息以确定它们的影响。

2.2 收集jmap信息

当发现服务的JVM内存使用异常时,如频繁Full GC或OOM时,需要采集jmap信息。需要注意的是,有一类OOM是byte array大小超过2GB引发的,这类不算JVM内存使用异常,收集jmap信息没用。

jmap可以收集JVM内存占用的直方图(histogram),也可以打heap dump,生成的文件用Eclipse MAT之类的分析工具做深入调查。注意使用同款jdk里的jmap。

2.2.1 内存占用直方图

收集内存占用直方图:

export JAVA_HOME=/usr/java/jdk1.8.0_232-cloudera
export PATH="$JAVA_HOME/bin:$PATH"
sudo -E -u impala jmap -histo $(pidof catalogd) > catalogd.jmap-histo.txt

如果JVM堆不大,或者日志里JvmPauseMonitor显示的GC pause时间不长,可以再采集 histo:live(会触发Full GC)

sudo -E -u impala jmap -histo:live $(pidof catalogd) > catalogd.jmap-histo-live.txt

2.2.2 JVM heap dump

注意找一个剩余空间大的目录操作(df -h查看磁盘使用信息),以防写满磁盘。以下示例在当前目录生成heap dump文件catalogd.hprof

export JAVA_HOME=/usr/java/jdk1.8.0_232-cloudera
export PATH="$JAVA_HOME/bin:$PATH"
sudo -E -u impala jmap -dump:live,format=b,file=catalogd.hprof $(pidof catalogd)

2.3 收集pstack

如果impalad无响应,或者发现某个线程疑似死循环,需要收集pstack。没有pstack指令的话可以安装gdb,就会有pstack。

对整个进程收集pstack会比较耗时:

sudo pstack $(pidof impalad) > impalad.pstack.txt

通过 “top -H -p $(pidof impalad)” 之类的指令可以查看哪些线程占用较高的CPU。然后再收集单个线程的pstack会轻一些:

sudo pstack threadId > impalad.pstack.txt

2.4 保留WebUI信息

Impala的Web UI展示了不少信息,都可以在 URL 加 “?json” 后缀的方式获取json形式的数据。如

wget "http://impalad_host:25000/metrics?json" -O impalad.metrics.txt
wget "http://impalad_host:25000/memz?json" -O impalad.memz.txt
wget "http://impalad_host:25000/jmx?json" -O impalad.jmx.txt
wget "http://impalad_host:25000/rpcz?json" -O impalad.rpcz.txt
wget "http://impalad_host:25000/queries?json" -O impalad.queries.txt
wget "http://impalad_host:25000/sessions?json" -O impalad.sessions.txt
wget "http://impalad_host:25000/admission?json" -O impalad.admission.txt

threadz页面显示的是累积信息,如累积的user time、sys time、iowait。需要多采集几次以后才能看增量,而且URL略有不同:“http://impalad_host:25000/thread-group?all&json”

以下指令采集100次:

for i in `seq 100`; do wget "http://impalad_host:25000/thread-group?all&json" -O impalad.threads.${i}.txt; (date && date +%s%N) >> impalad.threads.${i}.txt; sleep 0.5; done

2.5 备份日志

日志保留时间稍长,可以在上述步骤都做完后再备份。备份位置应选跟根目录(即 “/” 目录)不同的磁盘上的目录,以防日志占满根目录磁盘造成系统故障。

下面列出了各个服务对应的目录位置:

  • catalogd日志一般位于 /var/log/catalogd/
  • statestore日志位于 /var/log/statestored/
  • impalad 日志位于 /var/log/impalad/
  • HMS 日志位于 /var/log/hive/
  • NameNode 日志位于 /var/log/hadoop-hdfs

实际位置以实际配制为准。

2.6 备份profile

Impala的profile都会保存在coordinator本地,这个留存时间会比Web UI(默认100个)或CM里的更长,当找不到查询时可以在coordinator本地的profile文件里找到。目录一般位于日志目录下的profiles子目录,如 /var/log/impalad/profiles,可由 --profile_log_dir配置。

profile文件里一行是一个查询,格式是明文的query id和base64编码的profile。要找某个查询时可以把对应的那行复制出来单独成为一个文件,然后用impala-profile-tool转成text profile。

事先没有编译impala-profile-tool的话也可以用docker镜像:

docker pull apache/impala:4.0.0-impala_profile_tool
cat my_profile | docker run -i apache/impala:4.0.0-impala_profile_tool > my_profile.txt

2.7 备份minidump文件

impalad crash时一般会生成minidump文件,文件名如 7dd118b5-fd6a-9098-79215292-715fcff9.dmp,在日志中可以找到。

备份好对应的minidump文件,可用gzip压缩节省空间。

设计前沿