首页 > 解决方案 > 无法停止 Kerberos 调试日志记录

问题描述

我正在使用启用了 Kerberos 的 Spark 集群来运行我们的 Spark 应用程序。Kerberos 之前已由该组织的其他成员设置,我不知道它是如何工作的。最初,我们使用 Kerberos 调试日志来了解由于 jre 安全的 cacerts 文件夹中没有 JCE 证书而引发的异常“无法从用户获取密码”。但是,我们不再需要日志,因此使用 -Dsun.security.krb5.debug=false 参数来禁用日志记录。但是,这没有任何效果。有没有其他参数可以解决问题?请帮我。

标签: javaapache-sparkkerberos

解决方案


摘自Steve Loughran的 GitBook “Hadoop 和 Kerberos:门外的疯狂” ,低级秘密一章

JVM 库日志记录

您可以打开 Kerberos 低级日志记录
-Dsun.security.krb5.debug=true

这不是通过 Log4J 或 java.util 日志记录出来的;它只是出现在控制台上。这有点不方便——但请记住,它们是在系统的非常低级别的部分进行日志记录的。它至少记录。如果你发现自己处于这个水平,你就有麻烦了。请记住这一点。

如果您想调试 SPNEGO 中发生的事情,另一个系统属性允许您启用此功能:
-Dsun.security.spnego.debug=true

HADOOP_OPTS您可以在环境变量中要求这两个
export HADOOP_OPTS="-Dsun.security.krb5.debug=true -Dsun.security.spnego.debug=true"

Hadoop端JAAS调试

将 env 变量设置HADOOP_JAAS_DEBUG为 true,UGI 将在它创建的任何 JAAS 文件上设置“调试”标志。

您可以在客户端执行此操作,然后再发出 hadoop、hdfs 或 yarn 命令,并在 YARN 服务的环境脚本中设置它以在此处打开它。
export HADOOP_JAAS_DEBUG=true

在下一个 Hadoop 命令中,您将看到类似(.........)的跟踪

警告:Java 属性以sun.security.适用于 Sun/Oracle Java 运行时以及 OpenJDK 运行时及其变体开头。但不适用于 IBM Java 等。


安全性故障排除下的Java 8 文档 节选

如果要监控安全访问,可以设置 java.security.debugSystem 属性。
(.......)用逗号分隔多个选项。

在专门对 Kerberos 进行故障排除时,我个人使用该组合:
-Djava.security.debug=gssloginconfig,configfile,configparser,logincontext


Oracle JDK 9 发行说明部分工具/启动器 的摘录

JDK 9 支持一个新的环境变量JDK_JAVA_OPTIONS,以将选项附加到命令行上指定的选项。与旧版/不受支持的环境变量相比,新环境变量有几个优点,_JAVA_OPTIONS包括能够包含 java 启动器选项(...)

这两个 env 变量是一种非常肮脏(并且非常难以检测)的方式来注入 Java 系统属性,而不会出现在命令行上。


这对你意味着什么?好吧,你必须搜索多个 Java 系统 props 和环境变量,这可能是设置的

  • 对于环境变量:全局(cf. /etc/profile.d/*.sh),或帐户级别(cf.~/.bashrc和朋友),或在 Hadoop“包含文件”内部,或直接在运行 Spark 作业的 shell 脚本中
  • 对于系统道具:在以后在 shell 脚本中开发的任何 shell-or-env 变量中(...)或 Java 在启动时拾取的任何 env var,或在 YARN 配置文件中(使用 Spark-on-YARN 时),或直接在 Java 命令行上

祝你好运。
我个人会运行一个虚拟的 Spark 作业,它只转储所有 env 变量和 Java 系统道具;然后检查转储以检测要搜索的内容;find ... -exec grep ...然后在 Linux 文件系统上运行蛮力(根据需要重复)


推荐阅读