如何停止在AWS EMR Spark作业stdout日志中看到JVM Full Thread转储?

eni9jsuy  于 8个月前  发布在  Spark
关注(0)|答案(1)|浏览(58)

我在AWS EMR中运行PySpark作业。最近,我升级了(AWS EMR 6.4,Spark 3.1.2),并切换到在Docker容器中运行作业。从那以后,stdout日志中出现了以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上的进程。

v6ylcynt

v6ylcynt1#

我有一个解决方案来查看示例本身或其他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

资料来源:

相关问题