我在AWS EMR中运行PySpark作业。最近,我升级了(AWS EMR 6.4, Spark 3.1.2),并切换到在docker容器中运行作业。从那以后,在标准输出日志中有零星的以Full thread dump OpenJDK 64-Bit Server VM (25.312-b07 mixed mode)
开头的线程转储。
我一直不明白为什么会发生。在stderr中没有相关的错误或警告,作业不受影响。然而,这些线程转储使得很难读取标准输出日志,而且我一直无法弄清楚它们发生的原因。我尝试过的事情包括使用以前版本的AWS/EMR和更简单的EMR配置,因为我怀疑AWS EMR正在某处发送SIGQUIT
,因为我在Spark源代码中没有找到任何可以这样做的东西(除了由Spark UI发起的线程转储,以及被禁用的Spark任务阅读器)。
我不知道该怎么做,我会让JVM重定向这些线程转储,或者如果可以的话,甚至忽略它们的信号。我愿意考虑其他的建议。
我知道-Xrs
,但我怀疑这不是我想要的,因为它可能会杀死第一个SIGQUIT
上的进程。
我有一个在实例本身或其他Unix环境中查看日志的解决方案。
通过mawk
过滤器的管道输出,我们可以在读取或跟踪日志时删除堆栈跟踪。
在AWS Linux上,这需要您从Epel存储库中安装mawk
包。
sudo amazon-linux-extras install epel -y
sudo yum install mawk -y
创建一个函数,创建一个tmp文件名,跟踪和过滤输入文件,并将其写入tmp文件。然后使用less
打开tmp文件,并在用户关闭less
时删除tmp文件。过滤器删除^Full thread dump
和^[[0-9
之间的所有行这对我有用,因为我的日志从[2023-09-7 ...
less_log() {
tmp_file=$(mktemp)
tail -f -n +1 $1 | mawk -W interactive '/^Full thread dump/{f=1} /^[[0-9]/{f=0} !f' > "$tmp_file" &
less "$tmp_file"; kill %; rm "$tmp_file"
}
您现在可以像这样查看日志
less_log /var/log/hadoop-yarn/containers/application_1693901863825_0025/container_1693901863825_0025_01_000001/stdout
来源:
- https://www.unix.com/shell-programming-and-scripting/189267-how-ignore-single-multiple-lines-between-while-reading-file-unix.html
- https://superuser.com/a/1600093/1173501
- https://unix.stackexchange.com/a/139295/160014