如何停止在火花控制台上显示INFO消息?

Vis*_*was 168 log4j apache-spark spark-submit

我想停止火花壳上的各种消息.

我试图编辑该log4j.properties文件以阻止这些消息.

这是内容 log4j.properties

# Define the root logger with appender file
log4j.rootCategory=WARN, 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
Run Code Online (Sandbox Code Playgroud)

但是消息仍在控制台上显示.

以下是一些示例消息

15/01/05 15:11:45 INFO SparkEnv: Registering BlockManagerMaster
15/01/05 15:11:45 INFO DiskBlockManager: Created local directory at /tmp/spark-local-20150105151145-b1ba
15/01/05 15:11:45 INFO MemoryStore: MemoryStore started with capacity 0.0 B.
15/01/05 15:11:45 INFO ConnectionManager: Bound socket to port 44728 with id = ConnectionManagerId(192.168.100.85,44728)
15/01/05 15:11:45 INFO BlockManagerMaster: Trying to register BlockManager
15/01/05 15:11:45 INFO BlockManagerMasterActor$BlockManagerInfo: Registering block manager 192.168.100.85:44728 with 0.0 B RAM
15/01/05 15:11:45 INFO BlockManagerMaster: Registered BlockManager
15/01/05 15:11:45 INFO HttpServer: Starting HTTP Server
15/01/05 15:11:45 INFO HttpBroadcast: Broadcast server star
Run Code Online (Sandbox Code Playgroud)

我该如何阻止这些?

Akh*_*hlD 158

编辑conf/log4j.properties文件并更改以下行:

log4j.rootCategory=INFO, console
Run Code Online (Sandbox Code Playgroud)

log4j.rootCategory=ERROR, console
Run Code Online (Sandbox Code Playgroud)

另一种方法是:

启动spark-shell并输入以下内容:

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

Logger.getLogger("org").setLevel(Level.OFF)
Logger.getLogger("akka").setLevel(Level.OFF)
Run Code Online (Sandbox Code Playgroud)

之后你不会看到任何日志.

对于级别其他选项包括:all,debug,error,fatal,info,off,trace,trace_int,warn

有关每种的详细信息,请参阅文档.

  • 我认为OFF太严格了.WARN或ERROR可能更适合这里. (13认同)
  • 在项目主类中添加它. (2认同)
  • 很好的答案.有没有办法以编程方式从PySpark做同样的事情? (2认同)
  • 这的程序部分不起作用。而是从@cantdutchthis /sf/answers/2648579321/ 看到这个答案 (2认同)

can*_*his 137

刚开始spark-shell打字后;

sc.setLogLevel("ERROR")
Run Code Online (Sandbox Code Playgroud)

在Spark 2.0中:

spark = SparkSession.builder.getOrCreate()
spark.sparkContext.setLogLevel("ERROR")
Run Code Online (Sandbox Code Playgroud)

  • 它对我有用,但是在测试开始时我仍然会收到一些消息.任何的想法? (2认同)

Vis*_*was 46

感谢@AkhlD和@Sachin Janani建议修改.conf文件.

以下代码解决了我的问题:

1)import org.apache.log4j.{Level, Logger}在导入部分添加

2)在创建spark上下文对象后添加以下行,即val sc = new SparkContext(conf):

val rootLogger = Logger.getRootLogger()
rootLogger.setLevel(Level.ERROR)
Run Code Online (Sandbox Code Playgroud)

  • 试过这个,但仍然得到记录输出. (12认同)

Rah*_*rma 29

使用spark-submit或spark-sql在提交应用程序时使用以下命令更改日志级别:

spark-submit \
--conf "spark.driver.extraJavaOptions=-Dlog4j.configuration=file:<file path>/log4j.xml" \
--conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file:<file path>/log4j.xml"
Run Code Online (Sandbox Code Playgroud)

注意:更换<file path>其中log4j的配置文件存储.

Log4j.properties:

log4j.rootLogger=ERROR, console

# set the log level for these components
log4j.logger.com.test=DEBUG
log4j.logger.org=ERROR
log4j.logger.org.apache.spark=ERROR
log4j.logger.org.spark-project=ERROR
log4j.logger.org.apache.hadoop=ERROR
log4j.logger.io.netty=ERROR
log4j.logger.org.apache.zookeeper=ERROR

# add a ConsoleAppender to the logger stdout to write to the console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
# use a simple message format
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
Run Code Online (Sandbox Code Playgroud)

的log4j.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
   <appender name="console" class="org.apache.log4j.ConsoleAppender">
    <param name="Target" value="System.out"/>
    <layout class="org.apache.log4j.PatternLayout">
    <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" />
    </layout>
  </appender>
    <logger name="org.apache.spark">
        <level value="error" />
    </logger>
    <logger name="org.spark-project">
        <level value="error" />
    </logger>
    <logger name="org.apache.hadoop">
        <level value="error" />
    </logger>
    <logger name="io.netty">
        <level value="error" />
    </logger>
    <logger name="org.apache.zookeeper">
        <level value="error" />
    </logger>
   <logger name="org">
        <level value="error" />
    </logger>
    <root>
        <priority value ="ERROR" />
        <appender-ref ref="console" />
    </root>
</log4j:configuration>
Run Code Online (Sandbox Code Playgroud)

如果要将日志写入文件而不是控制台,请在log4j.xml中切换到FileAppender.LOG_DIR是您可以使用的日志目录的变量spark-submit --conf "spark.driver.extraJavaOptions=-D.

<appender name="file" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="file" value="${LOG_DIR}"/>
        <param name="datePattern" value="'.'yyyy-MM-dd"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d [%t] %-5p %c %x - %m%n"/>
        </layout>
    </appender>
Run Code Online (Sandbox Code Playgroud)

这里要理解的另一个重要的事情是,当作业以分布式模式启动时(部署模式集群和master作为yarn或mesos),log4j配置文件应该存在于驱动程序和工作节点上(log4j.configuration=file:<file path>/log4j.xml)否则log4j init会抱怨 -

log4j:ERROR无法读取配置文件[log4j.properties].java.io.FileNotFoundException:log4j.properties(没有这样的文件或目录)

提示解决这个问题 -

将log4j配置文件保存在分布式文件系统(HDFS或mesos)中,并使用log4j PropertyConfigurator添加外部配置.或者使用sparkContext addFile使其在每个节点上可用,然后使用log4j PropertyConfigurator重新加载配置.

  • 我已经取得了上述成功 - 我在spark-submit命令中使用`--files`来使log4j.properties在所有节点上都可用. (3认同)
  • 这是少数几个不会破坏传统上来自默认记录器的所有`org`日志的例子之一. (2认同)

Sac*_*ani 19

您可以通过将其级别设置为OFF来禁用日志,如下所示:

Logger.getLogger("org").setLevel(Level.OFF);
Logger.getLogger("akka").setLevel(Level.OFF);
Run Code Online (Sandbox Code Playgroud)

或者通过更改以下属性来编辑日志文件并将日志级别设置为off:

log4j.rootCategory=OFF, console
Run Code Online (Sandbox Code Playgroud)

  • 这对我来说在Spark 2.3.1上没有任何区别 (3认同)

Ata*_*ais 17

所有方法均附有实例

介绍

实际上,有很多方法可以做到这一点。有些难于其他,但最适合您的取决于您。我将尽力展示它们。


#1以编程方式在您的应用中

似乎是最简单的方法,但是您需要重新编译应用程序才能更改这些设置。我个人不喜欢它,但是效果很好。

例:

import org.apache.log4j.{Level, Logger}

val rootLogger = Logger.getRootLogger()
rootLogger.setLevel(Level.ERROR)

Logger.getLogger("org.apache.spark").setLevel(Level.WARN)
Logger.getLogger("org.spark-project").setLevel(Level.WARN)
Run Code Online (Sandbox Code Playgroud)

仅使用log4jAPI 即可实现更多目标。
来源:[ Log4J配置文档,配置部分]


#2遍log4j.properties期间spark-submit

这是非常棘手的,但并非不可能。和我的最爱。

在应用启动期间,Log4J始终在log4j.properties从classpath 查找并加载文件。

但是,使用spark-submitSpark Cluster的类路径时优先于应用程序的类路径!这就是为什么将此文件放入胖子jar不会覆盖群集的设置的原因!

添加-Dlog4j.configuration=<location of configuration file>spark.driver.extraJavaOptions (对于驱动程序)
spark.executor.extraJavaOptions (对于执行程序)

请注意,如果使用文件,file:则应明确提供协议,并且文件必须在所有节点上本地存在

为了满足最后一个条件,您可以将文件上传到节点可用的位置(如hdfs),也可以使用驱动程序在本地进行访问deploy-mode client。除此以外:

log4j.properties通过将其添加--files到要与应用程序一起上传的文件列表中,使用spark-submit来上传自定义。

来源:Spark文档,调试

脚步:

范例log4j.properties

# Blacklist all to warn level
log4j.rootCategory=WARN, 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

# Whitelist our app to info :)
log4j.logger.com.github.atais=INFO
Run Code Online (Sandbox Code Playgroud)

spark-submit对集群模式执行:

spark-submit \
    --master yarn \
    --deploy-mode cluster \
    --conf "spark.driver.extraJavaOptions=-Dlog4j.configuration=file:log4j.properties" \
    --conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file:log4j.properties" \
    --files "/absolute/path/to/your/log4j.properties" \
    --class com.github.atais.Main \
    "SparkApp.jar"
Run Code Online (Sandbox Code Playgroud)

请注意,--driver-java-options如果使用client模式,则必须使用。Spark文档,运行时环境

spark-submit在客户端模式下执行:

spark-submit \
    --master yarn \
    --deploy-mode cluster \
    --driver-java-options "-Dlog4j.configuration=file:/absolute/path/to/your/log4j.properties \
    --conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file:log4j.properties" \
    --files "/absolute/path/to/your/log4j.properties" \
    --class com.github.atais.Main \
    "SparkApp.jar"
Run Code Online (Sandbox Code Playgroud)

笔记:

  1. 上传的文件,以spark-cluster--files将可在根目录,所以没有必要添加任何路径file:log4j.properties
  2. 列出的文件--files必须提供绝对路径!
  3. file: 配置URI中的前缀是必需的。

#3编辑丛集 conf/log4j.properties

这将更改全局日志记录配置文件

更新$SPARK_CONF_DIR/log4j.properties文件,它将与其他配置一起自动上传。

来源:Spark文档,调试

要找到您SPARK_CONF_DIR可以使用spark-shell

atais@cluster:~$ spark-shell 
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 2.1.1
      /_/   

scala> System.getenv("SPARK_CONF_DIR")
res0: String = /var/lib/spark/latest/conf
Run Code Online (Sandbox Code Playgroud)

现在,只需进行编辑/var/lib/spark/latest/conf/log4j.properties(以方法2的示例为例),您的所有应用程序都将共享此配置。


#4覆盖配置目录

如果您喜欢解决方案3,但想针对每个应用程序对其进行自定义,则可以实际复制conf文件夹,编辑其内容并在期间将其指定为根配置spark-submit

要指定默认配置以外的其他配置目录“SPARK_HOME/conf”,可以进行设置SPARK_CONF_DIR。星火将使用配置文件(spark-defaults.confspark-env.shlog4j.properties从这个目录)。

来源:Spark文档,配置

脚步:

  1. 复制群集的conf文件夹(更多信息,方法3)
  2. log4j.properties在该文件夹中进行编辑(方法2中的示例)
  3. SPARK_CONF_DIR在执行之前设置为此文件夹spark-submit
    例如:

    export SPARK_CONF_DIR=/absolute/path/to/custom/conf
    
    spark-submit \
        --master yarn \
        --deploy-mode cluster \
        --class com.github.atais.Main \
        "SparkApp.jar"
    
    Run Code Online (Sandbox Code Playgroud)

结论

我不确定是否还有其他方法,但是我希望这涵盖了从A到Z的主题。如果没有,请随时在评论中ping我!

尽情享受吧!

  • 这应该是公认的答案。与其他人相比,它提供了更多细节并总结了更多用例。(不鼓励禁用日志。) (2认同)
  • 关于编程方法的附加说明 - 必须在创建 SparkContext 之前设置级别 (2认同)

Gaj*_*mbi 14

我只是将这一行添加到导入语句下面的所有pyspark脚本中.

SparkSession.builder.getOrCreate().sparkContext.setLogLevel("ERROR")
Run Code Online (Sandbox Code Playgroud)

我的pyspark脚本的示例标题

from pyspark.sql import SparkSession, functions as fs
SparkSession.builder.getOrCreate().sparkContext.setLogLevel("ERROR")
Run Code Online (Sandbox Code Playgroud)

  • 这有效,但它不会阻止在创建Spark上下文期间出现的58行INFO消息. (12认同)

cur*_*isp 12

上面的答案是正确的,但并没有完全帮助我,因为我需要其他信息.

我刚刚设置了Spark,因此log4j文件仍然具有'.template'后缀并且未被读取.我相信日志记录默认为Spark核心日志配置.

所以如果你像我一样发现上面的答案没有帮助,那么也许你也必须从你的log4j conf文件中删除'.template'后缀,然后上面的工作完美!

http://apache-spark-user-list.1001560.n3.nabble.com/disable-log4j-for-spark-shell-td11278.html


小智 6

将以下内容添加到 PySpark 就完成了我的工作:

self.spark.sparkContext.setLogLevel("ERROR")
Run Code Online (Sandbox Code Playgroud)

self.spark 是 Spark 会话 ( self.spark = spark_builder.getOrCreate())


小智 5

在Python / Spark中,我们可以执行以下操作:

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 )
Run Code Online (Sandbox Code Playgroud)

定义Sparkcontaxt'sc'之后,可以通过以下方式调用此函数:quiet_logs(sc)


Ani*_*non 5

TL;博士

对于Spark Context,您可以使用:

sc.setLogLevel(<logLevel>)
Run Code Online (Sandbox Code Playgroud)

哪里loglevel可以是ALL,DEBUG,ERROR,FATAL,INFO,OFF,TRACE或WARN.


细节-

在内部,然后用于设置使用的setLogLevel调用.org.apache.log4j.Level.toLevel(logLevel)org.apache.log4j.LogManager.getRootLogger().setLevel(level)

您可以直接将日志记录级别设置为OFF使用:

LogManager.getLogger("org").setLevel(Level.OFF)
Run Code Online (Sandbox Code Playgroud)

您可以在中设置Spark shell的默认日志记录conf/log4j.properties.使用conf/log4j.properties.template为出发点.

在Spark应用程序中设置日志级别

在独立Spark应用程序中或在Spark Shell会话中,使用以下命令:

import org.apache.log4j.{Level, Logger}

Logger.getLogger(classOf[RackResolver]).getLevel
Logger.getLogger("org").setLevel(Level.OFF)
Logger.getLogger("akka").setLevel(Level.OFF)
Run Code Online (Sandbox Code Playgroud)

禁用日志记录(在log4j中):

使用以下命令conf/log4j.properties完全禁用日志记录:

log4j.logger.org=OFF
Run Code Online (Sandbox Code Playgroud)

参考:Jacek Laskowski掌握Spark.


Gau*_*kar 5

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

--conf "spark.driver.extraJavaOptions=-Dlog4jspark.root.logger=WARN,console"
Run Code Online (Sandbox Code Playgroud)

从 log4j.properties 文件中检查确切的属性名称(此处为 log4jspark.root.logger)。希望这有帮助,干杯!

  • 从命令行设置它会很棒。但这对我不起作用。 (3认同)