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
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)
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)
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重新加载配置.
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)
Ata*_*ais 17
实际上,有很多方法可以做到这一点。有些难于其他,但最适合您的取决于您。我将尽力展示它们。
似乎是最简单的方法,但是您需要重新编译应用程序才能更改这些设置。我个人不喜欢它,但是效果很好。
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配置文档,配置部分]
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)
spark-cluster与--files将可在根目录,所以没有必要添加任何路径file:log4j.properties。--files必须提供绝对路径!file: 配置URI中的前缀是必需的。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的示例为例),您的所有应用程序都将共享此配置。
如果您喜欢解决方案3,但想针对每个应用程序对其进行自定义,则可以实际复制conf文件夹,编辑其内容并在期间将其指定为根配置spark-submit。
要指定默认配置以外的其他配置目录
“SPARK_HOME/conf”,可以进行设置SPARK_CONF_DIR。星火将使用配置文件(spark-defaults.conf,spark-env.sh,log4j.properties,等从这个目录)。
来源:Spark文档,配置
conf文件夹(更多信息,方法3)log4j.properties在该文件夹中进行编辑(方法2中的示例)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我!
尽情享受吧!
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)
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)
对于Spark Context,您可以使用:
Run Code Online (Sandbox Code Playgroud)sc.setLogLevel(<logLevel>)哪里
loglevel可以是ALL,DEBUG,ERROR,FATAL,INFO,OFF,TRACE或WARN.
在内部,然后用于设置使用的setLogLevel调用.org.apache.log4j.Level.toLevel(logLevel)org.apache.log4j.LogManager.getRootLogger().setLevel(level)
您可以直接将日志记录级别设置为
OFF使用:Run Code Online (Sandbox Code Playgroud)LogManager.getLogger("org").setLevel(Level.OFF)
您可以在中设置Spark shell的默认日志记录conf/log4j.properties.使用conf/log4j.properties.template为出发点.
在独立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)
使用以下命令conf/log4j.properties完全禁用日志记录:
log4j.logger.org=OFF
Run Code Online (Sandbox Code Playgroud)
参考:Jacek Laskowski掌握Spark.
只需将以下参数添加到您的spark-shell 或spark-submit 命令中
--conf "spark.driver.extraJavaOptions=-Dlog4jspark.root.logger=WARN,console"
Run Code Online (Sandbox Code Playgroud)
从 log4j.properties 文件中检查确切的属性名称(此处为 log4jspark.root.logger)。希望这有帮助,干杯!
| 归档时间: |
|
| 查看次数: |
156196 次 |
| 最近记录: |