为什么在 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
底线:
- 运行
oozie job -info ******
为您的 Oozie 工作流执行获取操作列表和相应的 "external IDs"
- 对于每个
job_*****_**
遗留 ID,运行 yarn logs -applicationId application_*****_** | more
浏览全局 YARN 日志,然后放大您的特定应用程序日志
- 现在您可以尝试将其自动化...玩得开心
B-)
"launcher" Oozie 工作原则的例外情况 -- 电子邮件操作/文件系统操作只是 API 执行的调用直接来自 Oozie 服务器进程;并且 MapReduce Action 会生成一个包含多个 Mappers 和 Reducers 的常规 YARN 作业。
我在 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
底线:
- 运行
oozie job -info ******
为您的 Oozie 工作流执行获取操作列表和相应的 "external IDs" - 对于每个
job_*****_**
遗留 ID,运行yarn logs -applicationId application_*****_** | more
浏览全局 YARN 日志,然后放大您的特定应用程序日志 - 现在您可以尝试将其自动化...玩得开心
B-)
"launcher" Oozie 工作原则的例外情况 -- 电子邮件操作/文件系统操作只是 API 执行的调用直接来自 Oozie 服务器进程;并且 MapReduce Action 会生成一个包含多个 Mappers 和 Reducers 的常规 YARN 作业。