Apache Spark 日志记录重定向 WebSphere 日志输出

Apache Spark logging redirects WebSphere log output

出于测试目的,我想 运行 在 WebSphere Application Server 上以本地模式启动 Spark。问题是,一旦初始化本地 spark 上下文,它就会通过 Spark 记录器重定向 WebSphere 服务器内的 所有 日志记录。

我"redirect"的意思是:所有日志行,无一例外,无论是哪个WebSphere组件或应用程序,都会根据WebSphere日志记录到SystemErr。在每条记录的消息上,您可以在实际日志消息之前看到另一个时间戳以及日志级别和记录器名称。

从其他问题中我发现 WebSphere 和 Spark 都在内部使用 SLF4J。如何防止 Spark 中的 SLF4J 通过自身重定向来自其他应用程序的所有日志记录?

我正在使用 WebSphere Application Server v8.5.5.6 和 Apache Spark v1.4.1 CHD4 二进制分发版。

我的猜测是带有 spark 的 slf4j 正在配置根记录器(例如 SLF4J 桥处理程序),它将所有 JUL 记录器输出路由到 SLF4J,然后记录到 System.err。

Liberty 需要并使用 JUL(除了我们自己的)。任何干扰根 JUL 日志处理程序的东西都会干扰 Liberty 的日志记录(感谢 JVM 单例)。看起来 Apache Spark assumes/enforces 使用了 log4j,并假设它也应该通过 log4j 路由所有 JUL。

您将需要配置 log4j 以不同方式处理 Liberty 消息,或者与 Apache Spark 搏斗(可能在那里进行一些修改)以允许使用 JUL(然后 Liberty 通过 server.xml 配置进行管理)。

或者根据这个 post 修改 slf4j(logback.xml) 配置: How to customize logging levels for Cassandra and Spark

以下方法似乎解决了我的日志记录问题:

  1. 删除Spark jar文件中org文件夹下的slf4j文件夹。 (任何用于修改 ZIP 文件的标准工具都可以在这里使用。)
  2. 除了修改后的 Spark jar 之外,将 SLF4J 的 API 和 JDK14 jar 作为库添加到 Web 应用程序。

(老实说,我没有再尝试配置 Spark 的日志记录,我的方法可能有点生硬,但它确实有效。)

以上步骤成功阻止了 Spark 接管 WebSphere 日志记录。相反,所有 Spark 生成的日志都由 WebSphere 正常处理。

当然这不会解决其他缺陷,例如 Spark 只允许每个 JVM 有一个 SparkContext(以及单个 JVM 中 WebSphere 节点 运行 上的所有应用程序),因此这种设置将继续仅用于测试目的。