如何关闭 Spark 中的 INFO 日志记录?
- 2025-03-05 09:18:00
- admin 原创
- 75
问题描述:
我使用 AWS EC2 指南安装了 Spark,并且可以使用脚本正常启动程序以bin/pyspark
获取 spark 提示符,还可以成功完成快速入门指南。
但是,我无论如何也想不出如何INFO
在每个命令之后停止所有详细日志记录。
我尝试了以下代码中几乎所有可能的情况(注释掉、设置为 OFF),在我启动应用程序log4j.properties
的文件夹中conf
以及每个节点上的文件中,但什么也没做。INFO
执行每个语句后,我仍然会打印日志语句。
我很困惑这应该如何工作。
#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.eclipse.jetty=WARN
log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO
log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO
这是我使用时的完整类路径SPARK_PRINT_LAUNCH_COMMAND
:
Spark 命令:/Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/Home/bin/java -cp:/root/spark-1.0.1-bin-hadoop2/conf:/root/spark-1.0.1-bin-hadoop2/conf:/root/spark-1.0.1-bin-hadoop2/lib/spark-assembly-1.0.1-hadoop2.2.0.jar:/root/spark-1.0.1-bin-hadoop2/lib/datanucleus-api-jdo-3.2.1.jar:/root/spark-1.0.1-bin-hadoop2/lib/datanucleus-core-3.2.2.jar:/root/spark-1.0.1-bin-hadoop2/lib/datanucleus-rdbms-3.2.1.jar -XX:MaxPermSize = 128m -Djava.library.path = -Xms512m -Xmx512m org.apache.spark.deploy.SparkSubmit spark-shell --class org.apache.spark.repl.Main
内容spark-env.sh
:
#!/usr/bin/env bash
# This file is sourced when running various Spark programs.
# Copy it as spark-env.sh and edit that to configure Spark for your site.
# Options read when launching programs locally with
# ./bin/run-example or ./bin/spark-submit
# - HADOOP_CONF_DIR, to point Spark towards Hadoop configuration files
# - SPARK_LOCAL_IP, to set the IP address Spark binds to on this node
# - SPARK_PUBLIC_DNS, to set the public dns name of the driver program
# - SPARK_CLASSPATH=/root/spark-1.0.1-bin-hadoop2/conf/
# Options read by executors and drivers running inside the cluster
# - SPARK_LOCAL_IP, to set the IP address Spark binds to on this node
# - SPARK_PUBLIC_DNS, to set the public DNS name of the driver program
# - SPARK_CLASSPATH, default classpath entries to append
# - SPARK_LOCAL_DIRS, storage directories to use on this node for shuffle and RDD data
# - MESOS_NATIVE_LIBRARY, to point to your libmesos.so if you use Mesos
# Options read in YARN client mode
# - HADOOP_CONF_DIR, to point Spark towards Hadoop configuration files
# - SPARK_EXECUTOR_INSTANCES, Number of workers to start (Default: 2)
# - SPARK_EXECUTOR_CORES, Number of cores for the workers (Default: 1).
# - SPARK_EXECUTOR_MEMORY, Memory per Worker (e.g. 1000M, 2G) (Default: 1G)
# - SPARK_DRIVER_MEMORY, Memory for Master (e.g. 1000M, 2G) (Default: 512 Mb)
# - SPARK_YARN_APP_NAME, The name of your application (Default: Spark)
# - SPARK_YARN_QUEUE, The hadoop queue to use for allocation requests (Default: ‘default’)
# - SPARK_YARN_DIST_FILES, Comma separated list of files to be distributed with the job.
# - SPARK_YARN_DIST_ARCHIVES, Comma separated list of archives to be distributed with the job.
# Options for the daemons used in the standalone deploy mode:
# - SPARK_MASTER_IP, to bind the master to a different IP address or hostname
# - SPARK_MASTER_PORT / SPARK_MASTER_WEBUI_PORT, to use non-default ports for the master
# - SPARK_MASTER_OPTS, to set config properties only for the master (e.g. "-Dx=y")
# - SPARK_WORKER_CORES, to set the number of cores to use on this machine
# - SPARK_WORKER_MEMORY, to set how much total memory workers have to give executors (e.g. 1000m, 2g)
# - SPARK_WORKER_PORT / SPARK_WORKER_WEBUI_PORT, to use non-default ports for the worker
# - SPARK_WORKER_INSTANCES, to set the number of worker processes per node
# - SPARK_WORKER_DIR, to set the working directory of worker processes
# - SPARK_WORKER_OPTS, to set config properties only for the worker (e.g. "-Dx=y")
# - SPARK_HISTORY_OPTS, to set config properties only for the history server (e.g. "-Dx=y")
# - SPARK_DAEMON_JAVA_OPTS, to set config properties for all daemons (e.g. "-Dx=y")
# - SPARK_PUBLIC_DNS, to set the public dns name of the master or workers
export SPARK_SUBMIT_CLASSPATH="$FWDIR/conf"
解决方案 1:
只需在spark目录中执行此命令:
cp conf/log4j.properties.template conf/log4j.properties
编辑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.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.rootCategory=INFO, console
经过:
log4j.rootCategory=WARN, console
保存并重新启动 shell。它对我而言适用于 OS X 上的 Spark 1.1.0 和 Spark 1.5.1。
解决方案 2:
在 Spark 2.0 中,您还可以使用setLogLevel为您的应用程序动态配置它:
from pyspark.sql import SparkSession
spark = SparkSession.builder.\n master('local').\n appName('foo').\n getOrCreate()
spark.sparkContext.setLogLevel('WARN')
在pyspark控制台中,默认spark
会话已经可用。
解决方案 3:
受到我做的 pyspark/tests.py 的启发
def quiet_logs(sc):
logger = sc._jvm.org.apache.log4j
logger.LogManager.getLogger("org"). setLevel( logger.Level.ERROR )
logger.LogManager.getLogger("akka").setLevel( logger.Level.ERROR )
在创建 SparkContext 后立即调用此方法,可将我的测试中记录的标准错误行数从 2647 减少到 163。但是,创建 SparkContext 本身会记录 163,最多
15/08/25 10:14:16 INFO SparkDeploySchedulerBackend: SchedulerBackend is ready for scheduling beginning after reached minRegisteredResourcesRatio: 0.0
并且我不清楚如何以编程方式调整这些。
解决方案 4:
编辑 conf/log4j.properties 文件并更改以下行:
log4j.rootCategory=INFO, console
到
log4j.rootCategory=ERROR, console
另一种方法是:
启动 spark-shell 并输入以下内容:
import org.apache.log4j.Logger
import org.apache.log4j.Level
Logger.getLogger("org").setLevel(Level.OFF)
Logger.getLogger("akka").setLevel(Level.OFF)
此后您将不会看到任何日志。
解决方案 5:
>>> log4j = sc._jvm.org.apache.log4j
>>> log4j.LogManager.getRootLogger().setLevel(log4j.Level.ERROR)
解决方案 6:
对于 PySpark,您还可以使用 在脚本中设置日志级别sc.setLogLevel("FATAL")
。来自文档:
控制我们的日志级别。这将覆盖任何用户定义的日志设置。有效的日志级别包括:ALL、DEBUG、ERROR、FATAL、INFO、OFF、TRACE、WARN
解决方案 7:
您可以使用 setLogLevel
val spark = SparkSession
.builder()
.config("spark.master", "local[1]")
.appName("TestLog")
.getOrCreate()
spark.sparkContext.setLogLevel("WARN")
解决方案 8:
这可能是由于 Spark 计算其类路径的方式所致。我的直觉是,Hadoop 的log4j.properties
文件在类路径上出现在 Spark 的前面,从而阻止了您的更改生效。
如果你跑
SPARK_PRINT_LAUNCH_COMMAND=1 bin/spark-shell
然后 Spark 将打印用于启动 shell 的完整类路径;就我而言,我看到
Spark Command: /usr/lib/jvm/java/bin/java -cp :::/root/ephemeral-hdfs/conf:/root/spark/conf:/root/spark/lib/spark-assembly-1.0.0-hadoop1.0.4.jar:/root/spark/lib/datanucleus-api-jdo-3.2.1.jar:/root/spark/lib/datanucleus-core-3.2.2.jar:/root/spark/lib/datanucleus-rdbms-3.2.1.jar -XX:MaxPermSize=128m -Djava.library.path=:/root/ephemeral-hdfs/lib/native/ -Xms512m -Xmx512m org.apache.spark.deploy.SparkSubmit spark-shell --class org.apache.spark.repl.Main
位于/root/ephemeral-hdfs/conf
类路径的头部。
我已经打开一个问题 [SPARK-2913]以在下一个版本中修复此问题(我应该很快就会发布一个补丁)。
与此同时,这里有一些解决方法:
添加。
export SPARK_SUBMIT_CLASSPATH="$FWDIR/conf"
spark-env.sh
删除(或重命名)
/root/ephemeral-hdfs/conf/log4j.properties
。
解决方案 9:
只需将以下参数添加到您的 spark-submit 命令中
--conf "spark.driver.extraJavaOptions=-Dlog4jspark.root.logger=WARN,console"
这只会暂时覆盖该作业的系统值。从 log4j.properties 文件中检查确切的属性名称(此处为 log4jspark.root.logger)。
希望这会有所帮助,加油!
解决方案 10:
Spark 1.6.2:
log4j = sc._jvm.org.apache.log4j
log4j.LogManager.getRootLogger().setLevel(log4j.Level.ERROR)
Spark 2.x:
spark.sparkContext.setLogLevel('WARN')
(spark 是 SparkSession)
或者使用旧方法,
在 Spark Dir 中重conf/log4j.properties.template
命名conf/log4j.properties
。
在 中log4j.properties
,更改log4j.rootCategory=INFO, console
为log4j.rootCategory=WARN, console
有不同的日志级别可用:
关闭(最具体,无日志记录)
严重(最具体,数据很少)
错误 - 仅在发生错误时记录
WARN - 仅在出现警告或错误时记录
信息(默认)
DEBUG - 记录详细步骤(以及上述所有日志)
TRACE(最不具体,大量数据)
全部(最不具体,所有数据)
解决方案 11:
程序化方式
spark.sparkContext.setLogLevel("WARN")
可用选项
ERROR
WARN
INFO
解决方案 12:
我将其与具有 1 个主服务器和 2 个从服务器的 Amazon EC2 和 Spark 1.2.1 一起使用。
# Step 1. Change config file on the master node
nano /root/ephemeral-hdfs/conf/log4j.properties
# Before
hadoop.root.logger=INFO,console
# After
hadoop.root.logger=WARN,console
# Step 2. Replicate this change to slaves
~/spark-ec2/copy-dir /root/ephemeral-hdfs/conf/
解决方案 13:
我的做法是:
spark-submit
在我运行脚本的位置
$ cp /etc/spark/conf/log4j.properties .
$ nano log4j.properties
更改INFO
为您想要的任何日志记录级别,然后运行spark-submit
解决方案 14:
如果您想继续使用日志记录(Python 的日志记录工具),您可以尝试为您的应用程序和 Spark 拆分配置:
LoggerManager()
logger = logging.getLogger(__name__)
loggerSpark = logging.getLogger('py4j')
loggerSpark.setLevel('WARNING')
解决方案 15:
以下是针对 Scala 用户的代码片段:
选项 1:
您可以在文件级别添加以下代码片段
import org.apache.log4j.{Level, Logger}
Logger.getLogger("org").setLevel(Level.WARN)
选项 2:
注意:这适用于所有使用 spark 会话的应用程序。
import org.apache.spark.sql.SparkSession
private[this] implicit val spark = SparkSession.builder().master("local[*]").getOrCreate()
spark.sparkContext.setLogLevel("WARN")
选项 3:
注意:由于您正在模块级别进行更改,因此应将此配置添加到您的 log4j.properties..(可能类似于 /etc/spark/conf/log4j.properties(其中有 spark 安装)或您的项目文件夹级别 log4j.properties)。这将适用于所有应用程序。
log4j.rootCategory=ERROR, console
恕我直言,选项 1 是明智的方法,因为它可以在文件级别关闭。
解决方案 16:
当使用 databricks 时,我能够设置 spark 日志记录级别,并通过像这样设置 spark 配置值来抑制集群的WARN
spark日志INFO
`spark.driver.extraJavaOptions -Dlog4jspark.root.logger=WARN,console`
然后,对于我的应用程序 ETL,我可以拥有像这样的单独日志记录级别
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger("etl")
logger.setLevel(logging.INFO)
def is_valid_id(id: int) -> bool:
"""
Checks if the user id is valid
Args:
id: user id
Returns: bool
"""
logger.info("is_valid_id")
if __name__ == "__main__":
is_valid_id(123)
输出:
INFO:etl:is_valid_id
解决方案 17:
您也可以在程序开始时以编程方式进行这样的设置。
Logger.getLogger("org").setLevel(Level.WARN)
扫码咨询,免费领取项目管理大礼包!