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

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

我怎么阻止这些?


当前回答

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

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

1)增加了导入org.apache.log4j。导入部分中的{级别,日志记录器}

2)在创建spark context对象后添加如下一行,即在val sc = new SparkContext(conf)后:

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

其他回答

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

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

1)增加了导入org.apache.log4j。导入部分中的{级别,日志记录器}

2)在创建spark context对象后添加如下一行,即在val sc = new SparkContext(conf)后:

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

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

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

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

log4j.rootCategory=OFF, console

所有方法收集并举例说明

介绍

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


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

享受你的人生!

sparkContext.setLogLevel("OFF")

在使用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"

注意:replace <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

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>

如果要将日志写入文件而不是控制台,则在log4j.xml中切换到FileAppender。LOG_DIR是一个日志目录变量,你可以使用spark-submit——conf "spark.driver.extraJavaOptions=-D "来提供。

<appender name=“file” class=“org.apache.log4j.DailyRollingFileAppender”> <参数名称=“file” 值=“${LOG_DIR}”/> <param name=“datePattern” value=“'.'yyyy-MM-dd”/> <layout class=“org.apache.log4j.PatternLayout”> <参数名称=“转换模式” 值=“%d [%t] %-5p %c %x - %m%n”/> </layout> </appender>

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

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

解决这个问题的提示-

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