为什么在 oozie 中执行时我的应用程序级日志会消失?

Why do my application level logs disappear when executed in oozie?

我在 CDH5 环境中使用 oozie。我也在使用 oozie 网络控制台。我无法从我的应用程序中看到任何日志。我可以看到 hadoop 日志、spark 日志等;但我没有看到特定于应用程序的日志。

在我的应用程序中,我包含了 src/main/resources/log4j.properties

# Root logger option
log4j.rootLogger=INFO, stdout

# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

在我的 oozie 工作流程中,我有 java-actions 和 spark-actions。

同样重要的是要注意,当我从命令行 运行 我的应用程序时,我确实看到了我的应用程序级别日志。

Oozie 运行在不同的 "launcher" 作业中执行每个操作——实际上是一个带有单个映射器的 YARN 作业 (请参阅下面的例外情况).

每当您在 job_000000000_0000 形式中看到 "external ID" 时,您就可以访问 application_000000_0000 的 YARN 日志(是的,"job" 是来自 Hadoop 1 的遗留命名约定,仍由 JobHistory 服务使用,但 YARN 有另一个命名约定)。

您的应用程序输出实际上转储到该 Oozie 的 YARN 日志中 "launcher"

  • 您的 StdErr 按原样转储,可以在 "stderr" 部分中检索
  • 你的 StdOut 被转储,每行都有一个前缀 (Oozie 使用该前缀来管理其 Shell 和 Pig 操作的 <capture_output/> 技巧) 在冗长的 "stdout" 部分
  • 的末尾
  • 并且 "syslog" 部分没有任何内容 AFAIK

底线:

  1. 运行 oozie job -info ****** 为您的 Oozie 工作流执行获取操作列表和相应的 "external IDs"
  2. 对于每个 job_*****_** 遗留 ID,运行 yarn logs -applicationId application_*****_** | more 浏览全局 YARN 日志,然后放大您的特定应用程序日志
  3. 现在您可以尝试将其自动化...玩得开心 B-)


"launcher" Oozie 工作原则的例外情况 -- 电子邮件操作/文件系统操作只是 API 执行的调用直接来自 Oozie 服务器进程;并且 MapReduce Action 会生成一个包含多个 Mappers 和 Reducers 的常规 YARN 作业。