如何停止在AWS EMR Spark作业标准输出日志中看到JVM全线程转储?



我在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

最新更新