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

我尝试编辑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

我怎么阻止这些?


当前回答

除了以上所有的帖子,下面是为我解决这个问题的方法。

Spark使用slf4j绑定到记录器。如果log4j不是找到的第一个绑定,则可以编辑log4j。所有你想要的属性文件,记录器甚至没有使用。例如,这可能是一个SLF4J输出:

SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [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: Found binding in [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: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. SLF4J: Actual binding is of type [org.slf4j.impl.SimpleLoggerFactory]

所以这里使用了SimpleLoggerFactory,它不关心log4j设置。

排除slf4j-simple包从我的项目通过

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

解决了这个问题,因为现在使用log4j记录器绑定和log4j中的任何设置。属性。 F.Y.I.我的log4j属性文件包含(除了正常配置)

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

希望这能有所帮助!

其他回答

禁用日志的方法如下:将日志级别设置为“OFF”。

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

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

log4j.rootCategory=OFF, console

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

所有方法收集并举例说明

介绍

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


#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的主题,如果没有,请在评论中联系我!

享受你的人生!

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

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

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

编辑conf/log4j。属性文件,并更改以下行:

log4j.rootCategory=INFO, console

to

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)

之后你就看不到任何日志了。

Level的其他选项包括:all、debug、error、fatal、info、off、trace、trace_int、warn

详细信息可以在文档中找到。