我想停止各种消息都是在火花壳。

我尝试编辑log4j。属性文件,以停止这些消息。

下面是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

我怎么阻止这些?


当前回答

sparkContext.setLogLevel("OFF")

其他回答

所有方法收集并举例说明

介绍

实际上,有很多方法可以做到这一点。 有些人比较难,但哪一种最适合你取决于你自己。我会尽力把它们都展示出来。


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

仅使用log4j API就可以实现更多功能。 来源:[Log4J配置文档,配置部分]


#2传递log4j。火花提交期间的属性

这个问题很棘手,但并非不可能。也是我的最爱。

Log4J在应用程序启动期间总是寻找和加载Log4J。来自类路径的属性文件。

然而,当使用Spark -submit Spark Cluster的类路径优先于应用程序的类路径!这就是为什么把这个文件放在你的fat-jar不会覆盖集群的设置!

添加-Dlog4j。Configuration =<配置文件>到 spark.driver.extraJavaOptions(用于驱动程序)或 spark.executor.extraJavaOptions(用于执行程序)。 注意,如果使用a 文件,文件:协议应该显式提供,和文件 需要在所有节点上本地存在。

为了满足最后一个条件,您可以将文件上传到节点可用的位置(如hdfs),或者如果使用部署模式客户端,则可以使用驱动程序本地访问它。否则:

上传一个自定义的log4j。属性使用spark-submit,将其添加到 要与应用程序一起上传的文件的——files列表。

来源:Spark docs, Debugging

步骤:

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

执行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"

注意,如果使用客户端模式,必须使用——driver-java-options。Spark docs, Runtime env

执行spark-submit,用于客户端模式:

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"

注:

使用——Files上传到spark-cluster的文件将在根目录下可用,因此不需要在file:log4j.properties中添加任何路径。 ——Files中列出的文件必须提供绝对路径! 配置URI中的前缀是必须的。


#3编辑集群的conf/log4j.properties

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

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

来源:Spark docs, Debugging

要找到你的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

现在只需编辑/var/lib/spark/latest/conf/log4j.属性(从方法#2的例子)和所有的应用程序将共享这个配置。


#4覆盖配置目录

如果你喜欢解决方案#3,但想要自定义每个应用程序,你可以复制conf文件夹,编辑它的内容,并在spark-submit期间指定为根配置。

如果需要指定默认的“SPARK_HOME/conf”以外的配置目录,可以设置“SPARK_CONF_DIR”。Spark将使用配置文件(Spark -defaults.conf, Spark -env.sh, log4j. conf)。属性等)。

来源:Spark docs, Configuration

步骤:

复制集群的conf文件夹(更多信息,方法#3) 编辑log4j。该文件夹中的属性(方法#2中的示例) 在执行spark-submit之前,将SPARK_CONF_DIR设置为该文件夹, 例子: 出口SPARK_CONF_DIR = /绝对路径/定制/ conf / spark-submit \ ——主纱\ ——部署模式集群\ ——class com.github.atais.Main \ “SparkApp.jar”


结论

我不确定是否有其他方法,但我希望这涵盖了从A到z的主题,如果没有,请在评论中联系我!

享受你的人生!

在命令行上很简单…

spark2-submit——driver-java-options = " -Droot。记录器=错误控制台”. .其他选项。

另一种完全停止日志的方法是:

    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...}

        }
    }

这对我很管用。 NullAppender是

一个忽略日志事件的Appender。(https://logging.apache.org/log4j/2.x/log4j-core/apidocs/org/apache/logging/log4j/core/appender/NullAppender.html)

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

self.spark.sparkContext.setLogLevel("ERROR")

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

一个有趣的想法是使用此处建议的RollingAppender: http://shzhangji.com/blog/2015/05/31/spark-streaming-logging-configuration/ 这样您就不会“污染”控制台空间,但仍然能够在$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