Spark的日志配置

在测试spark计算时,将作业提交到yarn(模式–master yarn-cluster)上,想查看print到控制台这是imposible的,因为作业是提交到yarn的集群上,so 去yarn集群上看日志是很麻烦的,但有特别想看下print的信息,方便调试或者别的目的

在Spark的conf目录下,把log4j.properties.template修改为log4j.properties,原来的内容如下:

#Set everything to be logged to the console
log4j.rootCategory=INFO, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n


#Settings to quiet third party logs that are too verbose
log4j.logger.org.spark-project.jetty=WARN
log4j.logger.org.spark-project.jetty.util.component.AbstractLifeCycle=ERROR
log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO
log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO

把log4j.rootCategory=INFO, console改为log4j.rootCategory=WARN, console即可抑制Spark把INFO级别的日志打到控制台上。如果要显示全面的信息,则把INFO改为DEBUG。

如果希望一方面把代码中的println打印到控制台,另一方面又保留spark 本身输出的日志,可以将它输出到日志文件中


log4j.rootCategory=INFO, console,FILE
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n


# Settings to quiet third party logs that are too verbose
log4j.logger.org.eclipse.jetty=WARN
log4j.logger.org.eclipse.jetty.util.component.AbstractLifeCycle=ERROR
log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO
log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO


log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender
log4j.appender.FILE.Threshold=DEBUG
log4j.appender.FILE.file=/home/hadoop/spark.log
log4j.appender.FILE.DatePattern='.'yyyy-MM-dd
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=[%-5p] [%d{yyyy-MM-dd HH:mm:ss}] [%C{1}:%M:%L] %m%n
# spark
log4j.logger.org.apache.spark=INFO

上面的操作,spark的日志一方面打印到控制台,一方面写入到/home/hadoop/spark.log中了,这是日志的继承特性,后面再来改进,目前把log4j.rootCategory=INFO, console,FILE改为log4j.rootCategory=INFO, FILE即可

<think> 我们正在回答关于Spark日志配置的问题。根据用户提供的引用,我们需要整合相关信息,并给出Spark日志配置的详细说明。 注意:用户之前的问题是关于ZooKeeper的log4j配置,现在转向Spark日志配置,因此我们将重点放在Spark上。 根据引用内容: 引用[1]提到Kylin Spark日志配置的重要性及基本步骤。 引用[2]提到Spark运行时的日志配置,特别是与History Server相关的配置。 引用[3]提到AWS Glue中Spark日志生成的问题及解决方案。 引用[4]展示了一个具体的Spark日志配置示例(log4j.properties)。 因此,我们回答的核心是Spark日志配置,包括: 1. 日志配置文件的位置和格式(log4j.properties) 2. 如何配置日志级别、输出目的地(控制台、文件等) 3.Spark History Server相关的日志配置(事件日志4. 在特定环境(如AWS Glue)中可能遇到的问题和解决方案 我们将结构化为以下几个部分: 1. 日志配置文件的位置和加载 2. 常用配置项详解 3. 配置日志级别 4. 配置输出到文件和滚动策略 5. 配置Spark事件日志(用于History Server) 6. 在集群环境中的配置(YARN) 7. 常见问题及解决(参考AWS Glue的问题) 最后,生成相关问题。 </think> ### Spark日志配置详解 Spark使用Log4j 2.x作为日志框架(Spark 3.0+),通过`log4j2.properties`文件管理日志行为。以下是核心配置解析: #### 1. **配置文件位置与加载** ```bash # 默认加载路径 $SPARK_HOME/conf/log4j2.properties ``` - **优先级规则**: 1. Spark应用参数:`--conf "spark.driver.extraJavaOptions=-Dlog4j.configurationFile=path"` 2. 环境变量:`export SPARK_LOG4J_CONF=path` 3. 默认配置文件 - **动态更新**:修改后需重启Spark Context生效 #### 2. **核心配置结构** ```properties # 日志根级别设置 rootLogger.level = INFO rootLogger.appenderRef.console.ref = ConsoleAppender rootLogger.appenderRef.rolling.ref = RollingFile # 控制台输出 appender.console.type = Console appender.console.name = ConsoleAppender appender.console.layout.type = PatternLayout appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n # 文件输出 appender.rolling.type = RollingFile appender.rolling.name = RollingFile appender.rolling.fileName = ${sys:spark.yarn.app.container.log.dir}/spark.log appender.rolling.filePattern = ${sys:spark.yarn.app.container.log.dir}/spark-%d{yyyy-MM-dd}.log appender.rolling.layout.type = PatternLayout appender.rolling.layout.pattern = %d{ISO8601} [%t] %p %c{1}:%L - %m%n appender.rolling.policies.type = Policies appender.rolling.policies.time.type = TimeBasedTriggeringPolicy appender.rolling.policies.size.type = SizeBasedTriggeringPolicy appender.rolling.policies.size.size=50MB appender.rolling.strategy.type = DefaultRolloverStrategy appender.rolling.strategy.max = 5 ``` **关键参数解析**: | 配置项 | 作用 | 推荐值 | |--------|------|--------| | `fileName` | 日志主文件路径 | `${spark.yarn.app.container.log.dir}`[^4] | | `filePattern` | 滚动文件命名 | `spark-%d{yyyy-MM-dd}.log` | | `policies.size` | 单文件最大尺寸 | `50MB`(生产环境) | | `strategy.max` | 保留文件数 | `5-10` | #### 3. **日志级别细化** ```properties # 降低特定模块日志级别 logger.jetty.name = org.sparkproject.jetty logger.jetty.level = WARN # 提升重要模块级别 logger.spark.name = org.apache.spark logger.spark.level = INFO # 启用DEBUG调试 logger.executor.name = org.apache.spark.executor logger.executor.level = DEBUG ``` **最佳实践**: - 网络通信模块(`jetty`)设为`WARN`减少噪声 - 核心模块(`org.apache.spark`)保持`INFO` - 调试时开启`DEBUG`需警惕性能影响 #### 4. **事件日志配置** ```properties spark.eventLog.enabled = true spark.eventLog.dir = hdfs:///spark-logs spark.history.fs.logDirectory = hdfs:///spark-logs ``` - **History Server依赖**:存储作业历史记录[^2] - **存储建议**:HDFS/S3等持久化存储 - **问题排查**:AWS Glue中需确认`.inprogress`文件正常转义[^3] #### 5. **性能优化配置** ```properties # 关闭冗余日志 logger.reducer.name = org.apache.spark.shuffle.sort logger.reducer.level = ERROR # 限制Executor输出 spark.executor.logs.rolling.maxRetainedFiles=3 spark.executor.logs.rolling.enableCompression=true ``` - **集群部署**:YARN模式下使用`spark.yarn.app.container.log.dir`统一路径[^4] - **磁盘优化**:启用压缩(`enableCompression`)节省50%空间 #### 6. **日志格式符号表 | 符号 | 含义 | 示例 | |------|------|------| | `%d{ISO8601}` | ISO8601时间戳 | `2023-11-15 14:23:45,678` | | `%p` | 日志级别 | `INFO` | | `%t` | 线程名 | `dispatcher-event-loop-3` | | `%c{1}` | 简写类名 | `Executor` | | `%L` | 代码行号 | `142` | | `%m%n` | 消息+换行 | `TaskSet finished` | #### 7. **动态调整技巧** ```bash # 运行时修改日志级别 curl -X POST "http://driver-node:4040/api/v1/applications/<app-id>/logLevel" \ -d '{"loggerName": "org.apache.spark", "level": "DEBUG"}' ``` - **适用场景**:生产环境临时诊断 - **限制**:Driver节点需启用REST API
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值