如何在 Spark 中关闭信息日志?

我使用 AWS EC2指南安装了 Spark,我可以使用 bin/pyspark脚本很好地启动程序以获得火花提示符,也可以成功地执行快速入门指南。

然而,我无论如何也想不出在每个命令之后如何停止所有冗长的 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/content/Home/bin/Java - 1-bin-hadoop2/conf:/root/park-1.0.1-bin-hadoop2/conf:/root/park-1.0.1-bin-hadoop2/lib/park-Assembly-1.0.1-hadoop2.2.0. jar:/root/park-1.0.1-bin-hadoop2/lib/datanucleus-api-jdo-3.2.1. jar:/root/park-1.0.1-bin-hadoop2/lib/datanucleus-core-3.2.2. jar:/root/park-1.0.1-bin-hadoop2/lib/parks-Assembly-1.0.1-bin-hadoop2/datanucleus-rdbms-3.2. jar - XX: MaxPermSize = 128m-Djava.library. path =-Xms512m-Xmx512m org.apache.spokDept. SparkSubmit park-shell —— class Org.apache.park.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"
169463 次浏览

这可能是由于 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

只需在 park 目录中执行以下命令:

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。

编辑 conf/log4j.properties 文件并修改以下代码行:

   log4j.rootCategory=INFO, console

    log4j.rootCategory=ERROR, console

另一种方法是:

点火火花外壳,并输入以下内容:

import org.apache.log4j.Logger
import org.apache.log4j.Level


Logger.getLogger("org").setLevel(Level.OFF)
Logger.getLogger("akka").setLevel(Level.OFF)

之后你就看不到任何记录了。

我使用这与亚马逊 EC21主和2奴隶和火花1.2。

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

灵感来自于我做的 pypark/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

我不清楚如何通过程序来调整它们。

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

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

控制我们的日志级别。这将覆盖任何用户定义的日志设置。有效的日志级别包括: 所有、调试、错误、致命、信息、关闭、跟踪、警告

我的方法是:

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

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

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

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

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

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

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

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

火花1.6.2:

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

火花2. x:

spark.sparkContext.setLogLevel('WARN')

(火花是火花会议)

或者用老办法,

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

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

可用的不同日志级别:

  • OFF (最具体的,无日志记录)
  • 致命的(最具体的,很少的数据)
  • 错误-仅在发生错误时记录日志
  • WARN-仅在出现警告或错误时记录日志
  • 信息(默认值)
  • DEBUG-记录详细步骤(以及上面提到的所有日志)
  • TRACE (最不具体的,大量的数据)
  • 所有(最不具体的,所有数据)

只需添加下面的参数到您的火花提交命令

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

这将临时性地覆盖该作业的系统值。请检查 log4j.properties 文件中的确切属性名(log4jspot.root.logger)。

希望这个有用,干杯!

您可以使用 setLogLevel

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


spark.sparkContext.setLogLevel("WARN")

以下是 Scala 用户的代码片段:

选项1:

下面的代码片段可以在文件级别添加

import org.apache.log4j.{Level, Logger}
Logger.getLogger("org").setLevel(Level.WARN)

选项2:

注意: 这将适用于所有使用 火花会议。

import org.apache.spark.sql.SparkSession


private[this] implicit val spark = SparkSession.builder().master("local[*]").getOrCreate()


spark.sparkContext.setLogLevel("WARN")

选项3:

注意: 这个配置应该添加到 log4j.properties 中。.(可以类似于/etc/park/conf/log4j.properties (其中存在火花安装)或您的项目文件夹级别 log4j.properties) 因为你是在模块级别改变。这将适用于所有的应用程序。

log4j.rootCategory=ERROR, console

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

程序化的方式

spark.sparkContext.setLogLevel("WARN")

可供选择

ERROR
WARN
INFO

您也可以像这样在程序开始时以编程方式设置它。

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