Apache spark 如何停止spark控制台上显示的信息消息?

Apache spark 如何停止spark控制台上显示的信息消息?,apache-spark,log4j,spark-submit,Apache Spark,Log4j,Spark Submit,我想停止spark shell上出现的各种消息 我试图编辑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 l

我想停止spark shell上出现的各种消息

我试图编辑
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
但是消息仍然显示在控制台上

下面是一些示例消息

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

如何停止这些操作?

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

Logger.getLogger("org").setLevel(Level.OFF);
Logger.getLogger("akka").setLevel(Level.OFF);
或编辑日志文件,只需更改以下属性即可将日志级别设置为“关闭”:

log4j.rootCategory=OFF, console

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

log4j.rootCategory=INFO, 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)
import org.apache.log4j.{Level, Logger}

Logger.getLogger(classOf[RackResolver]).getLevel
Logger.getLogger("org").setLevel(Level.OFF)
Logger.getLogger("akka").setLevel(Level.OFF)
之后你就看不到任何日志了

级别的其他选项包括:
所有
调试
错误
致命
信息
关闭
跟踪
警告


以上答案是正确的,但对我没有帮助,因为我需要更多的信息

我刚刚设置了Spark,所以log4j文件仍然有“.template”后缀,并且没有被读取。我认为日志记录默认为Spark core logging conf

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


一个有趣的想法是使用此处建议的RollingAppender: 这样,您就不会“polute”控制台空间,但仍然能够在$YOUR_LOG_PATH_HERE/${dm.logging.name}.LOG下看到结果

    log4j.rootLogger=INFO, rolling

log4j.appender.rolling=org.apache.log4j.RollingFileAppender
log4j.appender.rolling.layout=org.apache.log4j.PatternLayout
log4j.appender.rolling.layout.conversionPattern=[%d] %p %m (%c)%n
log4j.appender.rolling.maxFileSize=50MB
log4j.appender.rolling.maxBackupIndex=5
log4j.appender.rolling.file=$YOUR_LOG_PATH_HERE/${dm.logging.name}.log
log4j.appender.rolling.encoding=UTF-8
另一种解决原因的方法是观察您通常使用的日志类型(来自不同的模块和依赖项),并为每个日志设置粒度,同时将过于冗长的第三方日志设置为“安静”:

比如说,

    # Silence akka remoting
log4j.logger.Remoting=ERROR
log4j.logger.akka.event.slf4j=ERROR
log4j.logger.org.spark-project.jetty.server=ERROR
log4j.logger.org.apache.spark=ERROR
log4j.logger.com.anjuke.dm=${dm.logging.level}
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

感谢@AkhlD和@Sachin Janani建议对
.conf
文件进行更改

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

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

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

  • 按照其他说明调整conf/log4j.properties log4j.rootCategory=错误,控制台
  • 确保在执行spark作业时传递--file标志和log4j.properties文件路径
  • 如果它仍然不起作用,您可能有一个包含log4j.properties的jar,该jar在您的新log4j.properties之前被调用。从jar中删除log4j.properties(如果合适)

  • 在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 )
    
    定义Sparkcontaxt“sc”后的
    通过以下方式调用此函数:在启动火花壳后立即使用quiet_logs(sc)

    type

    sc.setLogLevel("ERROR")
    
    在Spark 2.0(Scala)中:

    API文档:

    对于Java:

    spark = SparkSession.builder.getOrCreate();
    spark.sparkContext().setLogLevel("ERROR");
    

    使用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"
    
    log4j.xml

    
    
    tl;博士 对于Spark上下文,您可以使用:

    sc.setLogLevel(<logLevel>)
    
    您可以在
    conf/log4j.properties
    中设置Spark shell的默认日志记录。使用
    conf/log4j.properties.template
    作为起点

    在Spark应用程序中设置日志级别 在独立Spark应用程序中或在Spark Shell会话中,使用以下命令:

    import org.apache.log4j.Logger
    import org.apache.log4j.Level
    
    Logger.getLogger("org").setLevel(Level.OFF)
    Logger.getLogger("akka").setLevel(Level.OFF)
    
    import org.apache.log4j.{Level, Logger}
    
    Logger.getLogger(classOf[RackResolver]).getLevel
    Logger.getLogger("org").setLevel(Level.OFF)
    Logger.getLogger("akka").setLevel(Level.OFF)
    
    禁用日志记录(在log4j中): 在
    conf/log4j.properties
    中使用以下命令完全禁用日志记录:

    log4j.logger.org=OFF
    


    参考:Jacek Laskowski的Mastering Spark。在命令行上操作简单


    spark2 submit--driver java options=“-Droot.logger=ERROR,console”
    。其他选项..

    除了上面所有的帖子,下面是我解决问题的方法

    Spark使用slf4j绑定到记录器。如果log4j不是找到的第一个绑定,那么您可以编辑log4j.properties文件,甚至不使用记录器。例如,这可能是一个可能的SLF4J输出:

    SLF4J:类路径包含多个SLF4J绑定。 SLF4J:在[jar:file:/C:/Users/~/.m2/repository/org/SLF4J/SLF4J simple/1.6.6/SLF4J-simple-1.6.6.jar!/org/SLF4J/impl/StaticLoggerBinder.class]中找到绑定 SLF4J:在[jar:file:/C:/Users/~/.m2/repository/org/SLF4J/SLF4J-log4j12/1.7.19/SLF4J-log4j12-1.7.19.jar!/org/SLF4J/impl/StaticLoggerBinder.class]中找到绑定 SLF4J:有关说明,请参阅。 SLF4J:实际绑定的类型为[org.SLF4J.impl.SimpleLoggerFactory]

    所以这里使用的是SimpleLogerFactory,它不关心log4j的设置

    通过从我的项目中排除slf4j简单包

    <dependency>
            ...
            <exclusions>
                ...
                <exclusion>
                    <artifactId>slf4j-simple</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
            </exclusions>
        </dependency>
    

    希望这有帮助

    我只是将这一行添加到import语句下方的所有pyspark脚本中

    SparkSession.builder.getOrCreate().sparkContext.setLogLevel("ERROR")
    
    pyspark脚本的示例头

    from pyspark.sql import SparkSession, functions as fs
    SparkSession.builder.getOrCreate().sparkContext.setLogLevel("ERROR")
    

    只需将以下参数添加到spark shell或spark submit命令中即可

    --conf "spark.driver.extraJavaOptions=-Dlog4jspark.root.logger=WARN,console"
    
    从log4j.properties文件中检查确切的属性名称(此处为log4jspark.root.logger)。 希望这有帮助,干杯

    这个对我很有用。 对于仅显示为
    stdout
    的错误消息,
    log4j.properties
    文件可能如下所示:

    # Root logger option
    log4j.rootLogger=ERROR, stdout
    # Direct log messages to stdout
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.Target=System.out
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
    
    注意:将
    log4j.properties
    文件放在
    src/main/resources
    文件夹中 有效。 如果
    log4j.properties
    不存在(意思是
    spark
    正在使用
    log4j defaults.properties
    文件),那么您可以通过转到
    spark_HOME/conf
    然后转到
    mv log4j.properties.template log4j.properties
    来创建它,然后继续进行上述更改


    如果您无法编辑java代码以插入
    .setLogLevel()
    语句,并且不需要更多的外部
    log4j.rootLogger=WARN, stdout
    ...
    log4j.category.org.apache.spark = WARN
    log4j.category.org.apache.parquet.hadoop.ParquetRecordReader = FATAL
    log4j.additivity.org.apache.parquet.hadoop.ParquetRecordReader=false
    log4j.logger.org.apache.parquet.hadoop.ParquetRecordReader=OFF
    
    SparkSession.builder.getOrCreate().sparkContext.setLogLevel("ERROR")
    
    from pyspark.sql import SparkSession, functions as fs
    SparkSession.builder.getOrCreate().sparkContext.setLogLevel("ERROR")
    
    --conf "spark.driver.extraJavaOptions=-Dlog4jspark.root.logger=WARN,console"
    
    # Root logger option
    log4j.rootLogger=ERROR, stdout
    # Direct log messages to stdout
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.Target=System.out
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
    
    spark-submit --deploy-mode client --master local <rest-of-cmd> | grep -v -F "INFO"
    
    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)
    
    # 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
    
    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"
    
    spark-submit \
        --master yarn \
        --deploy-mode client \
        --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"
    
    atais@cluster:~$ spark-shell 
    Welcome to
          ____              __
         / __/__  ___ _____/ /__
        _\ \/ _ \/ _ `/ __/  '_/
       /___/ .__/\_,_/_/ /_/\_\   version 2.1.1
          /_/   
    
    scala> System.getenv("SPARK_CONF_DIR")
    res0: String = /var/lib/spark/latest/conf
    
    export SPARK_CONF_DIR=/absolute/path/to/custom/conf
    
    spark-submit \
        --master yarn \
        --deploy-mode cluster \
        --class com.github.atais.Main \
        "SparkApp.jar"
    
    implementation group: "ch.qos.logback", name: "logback-classic", version: "1.2.3"
    implementation group: 'com.typesafe.scala-logging', name: "scala-logging_$scalaVersion", version: '3.9.2'
    
        import org.apache.log4j.Appender;
        import org.apache.log4j.BasicConfigurator;
        import org.apache.log4j.varia.NullAppender;
    
        public class SomeClass {
    
            public static void main(String[] args) {
                Appender nullAppender = new NullAppender();
                BasicConfigurator.configure(nullAppender);
    
                {...more code here...}
    
            }
        }
    
    self.spark.sparkContext.setLogLevel("ERROR")