Oozie提交spark-submit任务为何日志出现在MapReduce任务而非Spark任务中
问题根因分析
- Spark Client模式的进程运行机制导致
Spark以yarn-client模式提交时,Driver进程会直接运行在提交spark-submit命令的宿主进程所在环境,而非YARN分配的独立Container中。你通过Oozie Shell动作发起提交,Shell进程本身运行在Oozie启动的MapReduce任务Container内,因此Driver进程的所有输出会直接继承当前Shell进程的标准输出/错误流,被Oozie的日志收集逻辑捕获,进入Oozie MR任务的日志。
Spark默认的YARN日志收集仅会采集运行在YARN Container内的Executor进程日志,Client模式下Driver不在YARN管控范围内,自然不会被收录到Spark任务自身的日志系统中。 - Spring Boot默认日志输出配置导致
未做特殊配置的Spring Boot应用,日志默认输出到stdout/stderr,刚好对应Driver进程的输出流,会顺着进程链直接输出到上层Oozie Shell进程的日志收集路径。 - 无显式日志重定向/独立配置
你在Shell动作中调用spark-submit时,没有显式配置Spark Driver的日志输出路径,也没有对Spring Boot的日志输出做独立的文件配置,所有日志只能跟随父进程的输出流向进入Oozie日志。
对应解决思路
- 优先切换为
yarn-cluster模式提交任务,此时Driver会运行在YARN分配的独立Container中,Spark会自动收集Driver日志到Spark任务的YARN日志目录,和Executor日志统一管理。 - 若必须保留Client模式,可在
spark-submit命令中添加spark.driver.log相关配置指定Driver日志输出路径,或者在Spring Boot的配置文件中指定日志输出到独立的文件,再配合Oozie的日志收集配置将该文件纳入Spark日志目录。 - 也可以直接在Shell动作中对
spark-submit的输出做重定向:spark-submit [参数] > app.log 2>&1,再通过YARN的日志收集规则将自定义日志文件同步到任务日志路径。
内容的提问来源于stack exchange,提问作者hawarden_
相关产品推荐
相关产品推荐

