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

问题描述 投票:0回答:1

我在 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
时杀死进程。

java apache-spark jvm amazon-emr thread-dump
1个回答
0
投票

我有一个用于查看实例本身或其他 Unix 环境上的日志的解决方案。

通过通过

mawk
过滤器传输输出,我们可以在读取或拖尾日志时删除堆栈跟踪。

在 AWS Linux 上,这需要您从 Epel 存储库安装

mawk
软件包。

sudo amazon-linux-extras install epel -y
sudo yum install mawk -y

创建一个函数,用于创建 tmp 文件名、尾部和过滤输入文件并将其写入 tmp 文件。然后用

less
打开tmp文件,并在用户关闭时删除tmp文件
less
。 过滤器删除
^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

来源:

© www.soinside.com 2019 - 2024. All rights reserved.