如何closuresPySpark中的INFO日志logging?

我使用AWS EC2指南安装了Spark,并且可以使用bin/pyspark脚本启动程序,以获得火花提示,还可以成功执行Quick Start查询。

但是,我不能在我的生活中弄清楚如何在每个命令之后停止所有冗长的INFO日志logging。

我在下面的代码中尝试了几乎所有可能的场景(注释掉,设置为OFF),在我从启动应用程序的位置以及每个节点的conf文件夹的log4j.properties文件中,什么都不做。 执行完每条语句后,仍然会打印日志INFO语句。

我很困惑这是如何工作的。

 #Set everything to be logged to the console log4j.rootCategory=INFO, 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.apache.spark.repl.SparkIMain$exprTyper=INFO log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO 

当我使用SPARK_PRINT_LAUNCH_COMMAND时,这是我完整的类path:

Spark命令:/Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/Home/bin/java -cp:/root/spark-1.0.1-bin-hadoop2/conf:/root/spark-1.0.1 -bin-hadoop2 / CONF:/root/spark-1.0.1-bin-hadoop2/lib/spark-assembly-1.0.1-hadoop2.2.0.jar:/root/spark-1.0.1-bin-hadoop2/lib /datanucleus-api-jdo-3.2.1.jar:/root/spark-1.0.1-bin-hadoop2/lib/datanucleus-core-3.2.2.jar:/root/spark-1.0.1-bin-hadoop2 /lib/datanucleus-rdbms-3.2.1.jar -XX:MaxPermSize = 128m -Djava.library.path = -Xms512m -Xmx512m org.apache.spark.deploy.SparkSubmit spark-shell –class org.apache.spark。 repl.Main

spark-env.sh内容:

 #!/usr/bin/env bash # This file is sourced when running various Spark programs. # Copy it as spark-env.sh and edit that to configure Spark for your site. # Options read when launching programs locally with # ./bin/run-example or ./bin/spark-submit # - HADOOP_CONF_DIR, to point Spark towards Hadoop configuration files # - SPARK_LOCAL_IP, to set the IP address Spark binds to on this node # - SPARK_PUBLIC_DNS, to set the public dns name of the driver program # - SPARK_CLASSPATH=/root/spark-1.0.1-bin-hadoop2/conf/ # Options read by executors and drivers running inside the cluster # - SPARK_LOCAL_IP, to set the IP address Spark binds to on this node # - SPARK_PUBLIC_DNS, to set the public DNS name of the driver program # - SPARK_CLASSPATH, default classpath entries to append # - SPARK_LOCAL_DIRS, storage directories to use on this node for shuffle and RDD data # - MESOS_NATIVE_LIBRARY, to point to your libmesos.so if you use Mesos # Options read in YARN client mode # - HADOOP_CONF_DIR, to point Spark towards Hadoop configuration files # - SPARK_EXECUTOR_INSTANCES, Number of workers to start (Default: 2) # - SPARK_EXECUTOR_CORES, Number of cores for the workers (Default: 1). # - SPARK_EXECUTOR_MEMORY, Memory per Worker (eg 1000M, 2G) (Default: 1G) # - SPARK_DRIVER_MEMORY, Memory for Master (eg 1000M, 2G) (Default: 512 Mb) # - SPARK_YARN_APP_NAME, The name of your application (Default: Spark) # - SPARK_YARN_QUEUE, The hadoop queue to use for allocation requests (Default: 'default') # - SPARK_YARN_DIST_FILES, Comma separated list of files to be distributed with the job. # - SPARK_YARN_DIST_ARCHIVES, Comma separated list of archives to be distributed with the job. # Options for the daemons used in the standalone deploy mode: # - SPARK_MASTER_IP, to bind the master to a different IP address or hostname # - SPARK_MASTER_PORT / SPARK_MASTER_WEBUI_PORT, to use non-default ports for the master # - SPARK_MASTER_OPTS, to set config properties only for the master (eg "-Dx=y") # - SPARK_WORKER_CORES, to set the number of cores to use on this machine # - SPARK_WORKER_MEMORY, to set how much total memory workers have to give executors (eg 1000m, 2g) # - SPARK_WORKER_PORT / SPARK_WORKER_WEBUI_PORT, to use non-default ports for the worker # - SPARK_WORKER_INSTANCES, to set the number of worker processes per node # - SPARK_WORKER_DIR, to set the working directory of worker processes # - SPARK_WORKER_OPTS, to set config properties only for the worker (eg "-Dx=y") # - SPARK_HISTORY_OPTS, to set config properties only for the history server (eg "-Dx=y") # - SPARK_DAEMON_JAVA_OPTS, to set config properties for all daemons (eg "-Dx=y") # - SPARK_PUBLIC_DNS, to set the public dns name of the master or workers export SPARK_SUBMIT_CLASSPATH="$FWDIR/conf" 

只需在spark目录下执行这个命令:

 cp conf/log4j.properties.template conf/log4j.properties 

编辑log4j.properties:

 # Set everything to be logged to the console log4j.rootCategory=INFO, 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 

在第一行replace:

 log4j.rootCategory=INFO, console 

通过:

 log4j.rootCategory=WARN, console 

保存并重新启动你的shell。 它适用于OS X上的Spark 1.1.0和Spark 1.5.1。

受到了pyspark / tests.py的启发,我做到了

 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 ) 

在创buildSparkContext之后调用这个方法减less了logging我的testfrom 2647到163.的stderr行。但是,创buildSparkContext本身的日志163,直到

 15/08/25 10:14:16 INFO SparkDeploySchedulerBackend: SchedulerBackend is ready for scheduling beginning after reached minRegisteredResourcesRatio: 0.0 

我不清楚如何以编程方式调整这些。

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

  log4j.rootCategory=INFO, console 

  log4j.rootCategory=ERROR, console 

另一种方法是:

popupFire-shell并键入以下内容:

 import org.apache.log4j.Logger import org.apache.log4j.Level Logger.getLogger("org").setLevel(Level.OFF) Logger.getLogger("akka").setLevel(Level.OFF) 

之后你将不会看到任何日志。

 >>> log4j = sc._jvm.org.apache.log4j >>> log4j.LogManager.getRootLogger().setLevel(log4j.Level.ERROR) 

您还可以使用sc.setLogLevel("FATAL")在脚本中设置日志级别。 从文档 :

控制我们的logLevel。 这将覆盖任何用户定义的日志设置。 有效的日志级别包括:ALL,DEBUG,ERROR,FATAL,INFO,OFF,TRACE,WARN

这可能是由于Spark如何计算其类path。 我的直觉是,Hadoop的log4j.properties文件出现在类path的Spark之前,阻止你的更改生效。

如果你跑步

 SPARK_PRINT_LAUNCH_COMMAND=1 bin/spark-shell 

那么Spark将打印用于启动shell的完整类path; 就我而言,我明白了

 Spark Command: /usr/lib/jvm/java/bin/java -cp :::/root/ephemeral-hdfs/conf:/root/spark/conf:/root/spark/lib/spark-assembly-1.0.0-hadoop1.0.4.jar:/root/spark/lib/datanucleus-api-jdo-3.2.1.jar:/root/spark/lib/datanucleus-core-3.2.2.jar:/root/spark/lib/datanucleus-rdbms-3.2.1.jar -XX:MaxPermSize=128m -Djava.library.path=:/root/ephemeral-hdfs/lib/native/ -Xms512m -Xmx512m org.apache.spark.deploy.SparkSubmit spark-shell --class org.apache.spark.repl.Main 

其中/root/ephemeral-hdfs/conf位于类path的头部。

我已经打开了一个问题[SPARK-2913]在下一个版本中解决这个问题(我很快就会有一个补丁)。

与此同时,这里有几个解决方法:

  • export SPARK_SUBMIT_CLASSPATH="$FWDIR/conf"spark-env.sh
  • 删除(或重命名) /root/ephemeral-hdfs/conf/log4j.properties

在Spark 2.0中,您还可以使用setLogLevel为您的应用程序dynamicconfiguration它:

  from pyspark.sql import SparkSession spark = SparkSession.builder.\ master('local').\ appName('foo').\ getOrCreate() spark.sparkContext.setLogLevel('WARN') 

pyspark控制台中,默认的spark会话已经可用。

我在Amazon EC2中使用了1个主控和2个从属以及Spark 1.2.1。

 # Step 1. Change config file on the master node nano /root/ephemeral-hdfs/conf/log4j.properties # Before hadoop.root.logger=INFO,console # After hadoop.root.logger=WARN,console # Step 2. Replicate this change to slaves ~/spark-ec2/copy-dir /root/ephemeral-hdfs/conf/ 

我这样做的方式是:

在我运行spark-submit脚本的位置

 $ cp /etc/spark/conf/log4j.properties . $ nano log4j.properties 

INFO更改为所需的日志logging级别,然后运行spark-submit

我想继续使用日志logging(Python的日志logging工具),可以尝试为应用程序和Spark分割configuration:

 LoggerManager() logger = logging.getLogger(__name__) loggerSpark = logging.getLogger('py4j') loggerSpark.setLevel('WARNING')