spark on yarn日志过大问题

本文介绍如何在Spark的standalone和YARN模式下优化日志输出,包括调整日志滚动策略、启用压缩、限制日志文件大小等参数,以及如何通过修改log4j配置文件来定制日志记录方式,实现日志按任务动态分隔。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.在standlone模式下,为了减少日志在磁盘占用的输出的量,可以设置一下几个参数。

spark.executor.logs.rolling.maxRetainedFiles

spark.executor.logs.rolling.enableCompression

spark.executor.logs.rolling.maxSize

spark.executor.logs.rolling.strategy

spark.executor.logs.rolling.time.interval

http://spark.apache.org/docs/latest/configuration.html

2.在yarn模式下运行的spark任务,想要减少日志输出的量需要修改spark的日志配置文件,spark默认使用 $SPARK_HOME/conf/log4j.properties的配置。

如果修改此处的配置会对所有的集群所有提交的任务生效,如果不想做这种全局的修改,也可以通过在启动脚本里面指定配置的方式。

spark-submit提供--file的选项,可以加载本地配置。

spark-submit \

--master yarn-cluster \

--files $basepath/libs/log4j2.xml,$basepath/libs/log4j.properties \

 

在log4j.properties里面,修改配置为将日志定向到文件里,去掉原本输出到Console的配置。为避免同一个executor的不同job同时写一直日志文件的现象,需要将日志文件的输出路径指定为spark.yarn.app.container.log.dir。

这样,因为不同的任务使用的不同container,将会动态的创建日志到当前任务的container目录下,日志的输出和原来的stdout和stderr一样的效果。

log4j.rootLogger=${root.logger}

root.logger=INFO,RollingFile

#File

log4j.appender.RollingFile=org.apache.log4j.RollingFileAppender

log4j.appender.RollingFile.File=${spark.yarn.app.container.log.dir}/spark.log

log4j.appender.RollingFile.MaxFileSize=10MB

log4j.appender.RollingFile.MaxBackupIndex=3

log4j.appender.RollingFile.layout=org.apache.log4j.PatternLayout

log4j.appender.RollingFile.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n

 

另外,如果你的程序中使用了log4j2作为输出,还需要加载log4j2的配置,否则,用log4j2输出的日志将继续输出到stdout或stderr中,(具体看项目里面的指定)。

<?xml version="1.0" encoding="UTF-8"?>

<Configuration status="warn" name="MyApp" packages="org.apache.logging.log4j">

      <Appenders>

         <!--<Properties>

            <Property name="baseDir">$${sys:spark.yarn.app.container.log.dir}</Property>

         </Properties>-->

        <RollingFile name="RollingFile" filePattern="$${sys:spark.yarn.app.container.log.dir}/app-%d{MM-dd-yyyy}-%i.log">

          <PatternLayout>

            <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>

          </PatternLayout>

          <Policies>

            <TimeBasedTriggeringPolicy />

            <SizeBasedTriggeringPolicy size="10MB"/>

          </Policies>

         <DirectWriteRolloverStrategy maxFiles="3"/>

        </RollingFile>

      </Appenders>

      <Loggers>

        <Root level="DEBUG">

          <AppenderRef ref="RollingFile"/>

        </Root>

      </Loggers>

</Configuration>

 

即使做了这些之后,可能stdout和stderr中还是有少量的输出,是因为你的程序中可能有System.out、system.err的输出。

log4j.properties

log4j.rootLogger=${root.logger}
root.logger=INFO,
#Roll by file size
log4j.appender.RollingFile=org.apache.log4j.RollingFileAppender
log4j.appender.RollingFile.File=${spark.yarn.app.container.log.dir}/spark.log
log4j.appender.RollingFile.MaxFileSize=3000MB
log4j.appender.RollingFile.MaxBackupIndex=3
log4j.appender.RollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.RollingFile.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n
#Roll by day
#CON:not support clean strategy
log4j.appender.DayRoll=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DayRoll.file=${spark.yarn.app.container.log.dir}/spark.log
log4j.appender.DayRoll.DatePattern='.'yyyy-MM-dd
log4j.appender.DayRoll.layout=org.apache.log4j.PatternLayout
log4j.appender.DayRoll.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值