ChatGPT解决这个技术问题 Extra ChatGPT

如何在 Spark 中关闭 INFO 日志记录?

我使用 AWS EC2 指南安装了 Spark,我可以使用 bin/pyspark 脚本启动程序以进入 spark 提示符,并且还可以成功完成快速入门。

但是,我一生都无法弄清楚如何在每个命令之后停止所有详细的 INFO 日志记录。

我在 conf 文件夹中的 log4j.properties 文件中尝试了以下代码中几乎所有可能的场景(注释掉,设置为 OFF),在该文件夹中,我从每个节点以及每个节点上启动应用程序,但没有任何操作。在执行每个语句后,我仍然会打印日志记录 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 时的完整类路径:

火花命令:/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"
在创建会话后的 Spark 程序中,您可以为 Java SparkSession spark= SparkSession.builder().master("local").getOrCreate(); 设置日志级别,如下所示spark.sparkContext().setLogLevel("INFO");

g
gsamaras

只需在 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

保存并重新启动您的外壳。它适用于 OS X 上的 Spark 1.1.0 和 Spark 1.5.1。


这有帮助,重要的是要意识到 log4j.properties 不存在,除非您创建它。在 ubuntu 上,我不需要重新启动这些更改才能生效。
没有为我工作。火花 1.5。 RHEL 6。CDH 5.5。尝试创建新文件 /opt/cloudera/parcels/CDH/etc/spark/conf.dist/log4j.properties 并按照上述说明进行更改。并且还尝试编辑现有文件 /etc/spark/conf/log4j.properties。对 pyspark shell 和 pyspark-shell 无效。
我们是否需要对 spark 集群中的所有节点执行此操作?
这也阻止了我手动传递的信息日志。如何限制它只隐藏火花信息日志?
m
mdh

在 Spark 2.0 中,您还可以使用 setLogLevel 为您的应用程序动态配置它:

    from pyspark.sql import SparkSession
    spark = SparkSession.builder.\
        master('local').\
        appName('foo').\
        getOrCreate()
    spark.sparkContext.setLogLevel('WARN')

pyspark 控制台中,默认的 spark 会话已经可用。


您只是抑制了日志消息。但实际代码在后台运行。如果您看到 CPU 使用率。即使在空闲时,Spark 也会使用大量 CPU。
这正是无法访问 log4j 的 PySpark 工作的解决方案。
s
sam

受我所做的 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 之后调用它会将我的测试记录的 stderr 行从 2647 减少到 163。但是创建 SparkContext 本身会记录 163,最多

15/08/25 10:14:16 INFO SparkDeploySchedulerBackend: SchedulerBackend is ready for scheduling beginning after reached minRegisteredResourcesRatio: 0.0

我不清楚如何以编程方式调整这些。


如果您对如何调整这些线条有任何想法,请分享
我认为没有直接的解决方案可以更改 PySpark 中的默认调试级别。直到 SparkContext 启动。因为 sc._jvm 是在创建 SC 之后才创建的。您仍然可以通过 log4j.properies 文件更改它,尽管如其他答案中所述。 Spark 应该创建例如 spark.default.logging 变量,该变量可以作为覆盖默认 Root Logger 级别的选项传递给 SparkConf。
A
AkhlD

编辑您的 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)

之后您将看不到任何日志。


后一个选项适用于 spark-shell (scala),但是如果 pyspark 不更改 log4j 文件,你应该怎么做?
将 log4j 属性文件更改为“警告”会更好,但否则 wannik 的这个答案确实适用于将日志级别更改为 pyspark stackoverflow.com/a/34487962/127971 的控制台
w
wannik
>>> log4j = sc._jvm.org.apache.log4j
>>> log4j.LogManager.getRootLogger().setLevel(log4j.Level.ERROR)

我将它用于 pyspark。非常适合作为单行黑客。我仍然收到愚蠢的 YarnExecutor 死亡消息,这不应该是一个错误,恕我直言。就这样……
这会在执行后抑制日志记录,但不幸的是,在那之前有很多 INFO 日志。
G
Galen Long

对于 PySpark,您还可以使用 sc.setLogLevel("FATAL") 在脚本中设置日志级别。从 docs

控制我们的 logLevel。这会覆盖任何用户定义的日志设置。有效的日志级别包括:ALL、DEBUG、ERROR、FATAL、INFO、OFF、TRACE、WARN


适用于高于 1.4 的 Spark 版本的出色解决方案(因此,自 2015 年中期以来)。
我用 Spark 1.6.2 和 Scala 试过这个,它似乎不起作用
@Yeikel 此解决方案适用于 PySpark。抱歉,没有说清楚 - 我现在将编辑答案。
U
Unmesha Sreeveni U.B

您可以使用 setLogLevel

val spark = SparkSession
      .builder()
      .config("spark.master", "local[1]")
      .appName("TestLog")
      .getOrCreate()

spark.sparkContext.setLogLevel("WARN")

J
Josh Rosen

这可能是由于 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 位于类路径的开头。

我已打开 an issue [SPARK-2913] 以在下一个版本中解决此问题(我应该很快就会发布补丁)。

与此同时,这里有几个解决方法:

将 export SPARK_SUBMIT_CLASSPATH="$FWDIR/conf" 添加到 spark-env.sh。

删除(或重命名)/root/ephemeral-hdfs/conf/log4j.properties。


谢谢你。我尝试将其添加到我的 spark-env.sh 文件中,并尝试删除 log4j.properties 文件,但仍然获得 INFO 输出。我已将完整的类路径添加到问题中。
感谢您提供额外的信息。您能否也发布 spark-env.sh 的内容(您可以编辑私人信息,例如主机名)?
谢谢你。发布 spark-env.sh。抱歉,如果我误解了如何进行基本设置。我只是暂时将所有内容都保留为默认值,只是为了尝试一些测试。
G
Gaurav Adurkar

只需将以下参数添加到您的 spark-submit 命令

--conf "spark.driver.extraJavaOptions=-Dlog4jspark.root.logger=WARN,console"

这仅临时覆盖该作业的系统值。从 log4j.properties 文件中检查确切的属性名称(此处为 log4jspark.root.logger)。

希望这会有所帮助,干杯!


我发现另一个有用的是您可以指定 log4j.properties 文件:--conf spark.driver.extraJavaOptions='-Dlog4j.configuration=file:/home/foobar/log4j.properties
使用 Spark 2.4.7,@oleksii 答案中的设置 hadoop.root.logger 完美运行:--conf "spark.driver.extraJavaOptions=-Dhadoop.root.logger=WARN,console"
真的谢谢你,这就是我想要的。不幸的是, -Dlog4jspark.root.logger 和 -Dhadoop.root.logger 都不起作用,部分出于沮丧,我尝试了 -Droot.logger 并且它起作用了。 FWIW,如果它帮助别人,这就是我所做的:--conf "spark.driver.extraJavaOptions=-Droot.logger=FATAL,console"。
A
Ani Menon

火花 1.6.2:

log4j = sc._jvm.org.apache.log4j
log4j.LogManager.getRootLogger().setLevel(log4j.Level.ERROR)

火花 2.x:

spark.sparkContext.setLogLevel('WARN')

(火花是 SparkSession)

或者旧方法,

在 Spark 目录中将 conf/log4j.properties.template 重命名为 conf/log4j.properties

log4j.properties 中,将 log4j.rootCategory=INFO, console 更改为 log4j.rootCategory=WARN, console

可用的不同日志级别:

关闭(最具体,不记录)

致命的(最具体的,很少的数据)

ERROR - 仅在出现错误时记录

WARN - 仅在出现警告或错误时记录

信息(默认)

调试 - 记录详细信息步骤(以及上述所有日志)

TRACE(最不具体,大量数据)

ALL(最不具体,所有数据)


l
loneStar

程序化方式

spark.sparkContext.setLogLevel("WARN")

可用选项

ERROR
WARN 
INFO 

o
oleksii

我将它与具有 1 个主设备和 2 个从设备以及 Spark 1.2.1 的 Amazon EC2 一起使用。

# 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/

R
Ram Ghadiyaram

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(火花安装在那里)或您的项目文件夹级别 log4j.properties),因为您正在更改模块级。这将适用于所有应用程序。

log4j.rootCategory=ERROR, console

恕我直言,选项 1 是明智的方法,因为它可以在文件级别关闭。


u
user3827333

我这样做的方式是:

在我运行 spark-submit 脚本的位置

$ cp /etc/spark/conf/log4j.properties .
$ nano log4j.properties

INFO 更改为您想要的日志记录级别,然后运行您的 spark-submit


cp /etc/spark/conf/log4j.properties.template .
s
santifinland

如果您想继续使用日志记录(Python 的日志记录工具),您可以尝试为您的应用程序和 Spark 拆分配置:

LoggerManager()
logger = logging.getLogger(__name__)
loggerSpark = logging.getLogger('py4j')
loggerSpark.setLevel('WARNING')

r
rahul sharma

您也可以像这样以编程方式设置它,在程序的开头。

Logger.getLogger("org").setLevel(Level.WARN)