SparkでINFOロギングをオフにする方法は?


144

AWS EC2ガイドを使用してSparkをインストールしました。bin/pysparkスクリプトを使用してプログラムを正常に起動し、sparkプロンプトを表示し、クイックスタートクワイエドを正常に実行することもできます。

ただし、私はINFO、各コマンドの後にすべての詳細ログを停止する方法を理解することができません。

各ノードからだけでなく、アプリケーションを起動するフォルダー内のlog4j.propertiesファイル内の以下のコード(コメントアウト、OFFに設定)でほぼすべての可能なシナリオを試しconfましたが、何も実行されていません。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です:

Sparkコマンド:/ライブラリ/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 (e.g. 1000M, 2G) (Default: 1G)
# - SPARK_DRIVER_MEMORY, Memory for Master (e.g. 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 (e.g. "-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 (e.g. 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 (e.g. "-Dx=y")
# - SPARK_HISTORY_OPTS, to set config properties only for the history server (e.g. "-Dx=y")
# - SPARK_DAEMON_JAVA_OPTS, to set config properties for all daemons (e.g. "-Dx=y")
# - SPARK_PUBLIC_DNS, to set the public dns name of the master or workers

export SPARK_SUBMIT_CLASSPATH="$FWDIR/conf"

セッションを作成した後のSparkプログラムでは、Java SparkSessionに対して以下のようにログレベルを設定できます。spark= SparkSession.builder()。master( "local")。getOrCreate(); spark.sparkContext()。setLogLevel( "INFO");
iKing

回答:


158

このコマンドを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

最初の行で置き換えます。

log4j.rootCategory=INFO, console

沿って:

log4j.rootCategory=WARN, console

シェルを保存して再起動します。OS XのSpark 1.1.0とSpark 1.5.1で動作します。


1
これは、作成しないとlog4j.propertiesが存在しないことを理解するのに役立ちました。ubuntuでは、これらの変更を有効にするために再起動する必要はありませんでした。
破壊的な

うまくいきませんでした。Spark 1.5。RHEL 6. CDH 5.5。新しいファイル/opt/cloudera/parcels/CDH/etc/spark/conf.dist/log4j.propertiesを作成し、上記のように変更してみました。また、既存のファイル/etc/spark/conf/log4j.propertiesを編集してみました。pysparkシェルにもpyspark-shellにも影響はありません。
Tagar

Sparkクラスターのすべてのノードでこれを行う必要がありますか?
クラウド

54

私がやった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 )

SparkContextを作成した直後にこれを呼び出すと、テスト用にログに記録されるstderr行が2647から163に減少しました。ただし、SparkContext自体を作成すると163、最大

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

これらをプログラムで調整する方法はわかりません。


2
これらの線を調整する方法についてのアイデアがある場合は、共有してください
Irene

SparkContextが起動するまで、PySparkでデフォルトのデバッグレベルを変更する直接的な解決策はないと思います。SCが作成された後にのみsc._jvmが作成されるためです。他の回答で説明されているように、log4j.properiesファイルを使用して変更することもできます。Sparkは、たとえば、デフォルトのルートロガーレベルを上書きするオプションとしてSparkConfに渡すことができるspark.default.logging変数を作成する必要があります。
Tagar 2016

37

Spark 2.0では、setLogLevelを使用してアプリケーション用に動的に構成することもできます。

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

pysparkのコンソール、デフォルトのsparkセッションがすでに利用できるようになります。


ログメッセージを抑制しました。しかし、実際のコードはバックグラウンドで実行されています。CPU使用率が表示された場合。アイドル時でも多くのCPUを使用してスパークします。
hurelhuyag

これは、アクセスできないPySpark作業のソリューションでしたlog4j
yeliabsalohcin

35

conf / log4j.propertiesファイルを編集して、次の行を変更します。

   log4j.rootCategory=INFO, console

    log4j.rootCategory=ERROR, console

別のアプローチは:

スパークシェルを起動し、次のように入力します。

import org.apache.log4j.Logger
import org.apache.log4j.Level

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

その後、ログは表示されません。


3
後者のオプションは、spark-shell(scala)で機能しますが、pysparkの場合、log4jファイルを変更せずに何をすべきですか?
hmi2015

log4jプロパティファイルを「警告」に変更することをお勧めしますが、それ以外の場合、wannikによるこの回答は、pysparkのログレベルをコンソールに変更するために機能しますstackoverflow.com/a/34487962/127971
マイケル・

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

これをpysparkに使用しました。ワンライナーハックとして最適です。私はまだ愚かなYarnExecutorが死亡したというメッセージを受け取りますが、これはエラーではありません、私見です。そしてそれは行く...
ジャタル

2
これにより、実行後のロギングが抑制されますが、残念ながら、その時点より前の多くのINFOログがあります。
DavidJ

28

PySparkの場合、を使用してスクリプトでログレベルを設定することもできますsc.setLogLevel("FATAL")ドキュメントから:

logLevelを制御します。これにより、ユーザー定義のログ設定が上書きされます。有効なログレベルには、ALL、DEBUG、ERROR、FATAL、INFO、OFF、TRACE、WARNがあります。


1.4より新しいバージョンのSpark(2015年半ば以降)で機能する優れたソリューション。
ジーリー2017

私はこれをSpark 1.6.2とScalaで試しましたが、うまくいかないようです
Yeikel

@YeikelこのソリューションはPySpark用です。申し訳ありませんが明確にされませんでした-今すぐ回答を編集します。
Galen Long

15

あなたはsetLogLevelを使うことができます

val spark = SparkSession
      .builder()
      .config("spark.master", "local[1]")
      .appName("TestLog")
      .getOrCreate()

spark.sparkContext.setLogLevel("WARN")

14

これは、Sparkがクラスパスを計算する方法が原因である可能性があります。私の直感は、Hadoopのlog4j.propertiesファイルがクラスパス上のSparkの前に表示され、変更が有効にならないことです。

走れば

SPARK_PRINT_LAUNCH_COMMAND=1 bin/spark-shell

その後、Sparkはシェルの起動に使用される完全なクラスパスを出力します。私の場合は、

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のクラスパスの先頭にあります。

問題をオープンしました[SPARK-2913]次のリリースでこれを修正するを(すぐにパッチが出るはずです)。

それまでの間、次の2つの回避策があります。

  • 追加export SPARK_SUBMIT_CLASSPATH="$FWDIR/conf"しますspark-env.shます。
  • 削除(または名前変更)し/root/ephemeral-hdfs/conf/log4j.propertiesます。

ありがとうございました。これをspark-env.shファイルに追加しようとしました。また、log4j.propertiesファイルを削除しようとしましたが、INFO出力がまだ取得されていました。質問に完全なクラスパスを追加しました。
horatio1701d 2014

追加情報をありがとう。また、spark-env.shの内容も投稿できますか(ホスト名などのプライベート情報を編集できます)。
Josh Rosen

ありがとうございました。spark-env.shを投稿しました。基本設定を行う方法を誤解している場合は申し訳ありません。今のところ、いくつかのテストを行うために、すべてをできるだけデフォルトのままにしました。
horatio1701d 2014

9

Spark 1.6.2:

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

Spark 2.x:

spark.sparkContext.setLogLevel('WARN')

(sparkはSparkSessionです)

あるいは、古い方法、

Spark Dirでに名前conf/log4j.properties.templateを変更conf/log4j.propertiesします。

log4j.properties、変更log4j.rootCategory=INFO, consolelog4j.rootCategory=WARN, console

利用可能なさまざまなログレベル:

  • オフ(最も具体的、ログなし)
  • 致命的(最も具体的、データが少ない)
  • エラー-エラーが発生した場合にのみログに記録する
  • WARN-警告またはエラーの場合にのみログに記録する
  • INFO(デフォルト)
  • デバッグ-ログの詳細手順(および上記のすべてのログ)
  • TRACE(特定度が最も低く、大量のデータ)
  • ALL(特定度が最も低く、すべてのデータ)

8

プログラム的な方法

spark.sparkContext.setLogLevel("WARN")

利用可能なオプション

ERROR
WARN 
INFO 

5

これを、1つのマスターと2つのスレーブを備えたAmazon EC2と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/

4

以下のパラメーターをspark-submitコマンドに追加するだけです

--conf "spark.driver.extraJavaOptions=-Dlog4jspark.root.logger=WARN,console"

これは、そのジョブについてのみシステム値を一時的にオーバーライドします。log4j.propertiesファイルから正確なプロパティ名(ここではlog4jspark.root.logger)を確認します。

よろしくお願いいたします。


:私は重宝もう一つは、あなたがlog4j.propertiesファイルを指定することができるということである--conf spark.driver.extraJavaOptions='-Dlog4j.configuration=file:/home/foobar/log4j.properties
セラ

2

以下のスカラユーザー向けのコードスニペット:

オプション1 :

ファイルレベルで追加できるスニペットの下

import org.apache.log4j.{Level, Logger}
Logger.getLogger("org").setLevel(Level.WARN)

オプション2:

注:これは、sparkセッションを使用しているすべてのアプリケーションに適用されます。

import org.apache.spark.sql.SparkSession

  private[this] implicit val spark = SparkSession.builder().master("local[*]").getOrCreate()

spark.sparkContext.setLogLevel("WARN")

オプション3:

注:で変更しているため、この構成はlog4j.properties ..(/etc/spark/conf/log4j.properties(sparkインストールがある場所)またはプロジェクトフォルダーレベルのlog4j.propertiesのようになる可能性があります)に追加する必要があります。モジュールレベル。これは、すべてのアプリケーションに適用されます。

log4j.rootCategory=ERROR, console

私見、オプション1はファイルレベルでオフにできるので賢い方法です。


1

私のやり方は:

spark-submitスクリプトを実行する場所で

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

必要INFOなレベルのロギングに変更してから、spark-submit


cp /etc/spark/conf/log4j.properties.template .
deepelement

0

ロギング(Pythonのロギング機能)を使い続けたいので、アプリケーションとSparkの構成を分割してみることができます。

LoggerManager()
logger = logging.getLogger(__name__)
loggerSpark = logging.getLogger('py4j')
loggerSpark.setLevel('WARNING')
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.