web-dev-qa-db-ja.com

スパークコンソールに表示されるINFOメッセージを止めるには?

私はspark shellに出てくる様々なメッセージを止めたいのですが。

これらのメッセージを止めるために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

しかし、メッセージはまだコンソールに表示されています。

これがメッセージの例です

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

どうやってこれらを止めるのですか?

149
Vishwas

.confファイルの変更を提案してくれてありがとう@AkhlDと@Sachin Janani。

以下のコードは私の問題を解決しました:

1)インポートセクションにimport org.Apache.log4j.{Level, Logger}を追加しました

2)スパークコンテキストオブジェクトの作成後、すなわちval sc = new SparkContext(conf)の後に次の行を追加しました。

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

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

log4j.rootCategory=INFO, console

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)

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

レベルのその他のオプションには、alldebugerrorfatalinfoofftracetrace_intwarn

それぞれの詳細はドキュメントに記載されています。

150
AkhlD

spark-Shell型を起動した直後。

sc.setLogLevel("ERROR")

Spark 2.0では:

spark = SparkSession.builder.getOrCreate()
spark.sparkContext.setLogLevel("ERROR")
117
cantdutchthis

以下のコマンドを使用して、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"

注:<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はlogsディレクトリの変数で、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>

ここで理解しておくべきもう1つの重要なことは、ジョブが分散モード(デプロイモードのクラスタとマスターをヤーンまたはメソとして)で起動された場合、log4j設定ファイルがドライバノードとワーカーノードに存在するはずです(log4j.configuration=file:<file path>/log4j.xml)です。

log4j:エラー設定ファイル[log4j.properties]を読み取れませんでした。 Java.io.FileNotFoundException:log4j.properties(そのようなファイルまたはディレクトリはありません)

この問題を解決するためのヒント -

Log4j設定ファイルを分散ファイルシステム(HDFSまたはmesos)に保存し、 log4j PropertyConfigurator を使用して外部設定を追加します。または sparkContext addFile を使用して各ノードで使用できるようにしてから、log4j PropertyConfiguratorを使用して設定をリロードします。

26
Rahul Sharma

次のようにログを無効に設定してログを無効にします。

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

または、ログファイルを編集し、次のプロパティを変更してログレベルをオフに設定します。

log4j.rootCategory=OFF, console
18
Sachin Janani

インポートステートメントのすぐ下にあるすべてのpysparkスクリプトにこの行を追加します。

SparkSession.builder.getOrCreate().sparkContext.setLogLevel("ERROR")

私のpysparkスクリプトのヘッダ例

from pyspark.sql import SparkSession, functions as fs
SparkSession.builder.getOrCreate().sparkContext.setLogLevel("ERROR")
12
Gajendra D Ambi

上記の答えは正しいですが、必要な追加情報があるため、正確には役に立ちませんでした。

Log4jファイルにまだ '.template'接尾辞が付いていて、読み取られていないように、Sparkをセットアップしました。私はロギングがデフォルトでSparkコアロギングconfになると信じています。

あなたが私のようで、上記の答えが役に立たなかったとわかったら、多分あなたもあなたのlog4j confファイルから '.template'接尾辞を取り除かなければならない、そしてそれから上記は完全にうまくいく!

http://Apache-spark-user-list.1001560.n3.nabble.com/disable-log4j-for-spark-Shell-td11278.html

10
curtisp

tl; dr

スパークコンテキストの場合は、次のものを使用できます。

sc.setLogLevel(<logLevel>)

loglevelは、ALL、DEBUG、ERROR、FATAL、INFO、OFF、TRACE、またはWARNです。


詳細 -

内部的には、setLogLevelorg.Apache.log4j.Level.toLevel(logLevel)を呼び出し、それを使用してorg.Apache.log4j.LogManager.getRootLogger().setLevel(level)を使用して設定します。

次のようにして、ロギングレベルを直接OFFに設定できます。

LogManager.getLogger("org").setLevel(Level.OFF)

Spark Shellのデフォルトのログ記録はconf/log4j.propertiesで設定できます。出発点としてconf/log4j.properties.templateを使用してください。

Sparkアプリケーションでログレベルを設定する

スタンドアロンの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)

ロギングを無効にする(log4j):

ロギングを完全に無効にするには、conf/log4j.propertiesで以下を使用します。

log4j.logger.org=OFF

参考:Jacek Laskowskiによるスパークの習得。

5
Ani Menon

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 )

Sparkcontaxt 'sc'を定義した後、この関数を次のように呼び出します。quiet_logs(sc)

4

例で集めたすべての方法

イントロ

実際には、それには多くの方法があります。他の人よりも難しい人もいますが、どちらがあなたに最も適しているかはあなた次第です。私はそれらすべてを紹介しようとします。


#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.properties中にspark-submitを渡す

これはとてもトリッキーですが、不可能ではありません。そして私のお気に入り。

アプリ起動時のLog4Jは常にクラスパスからlog4j.propertiesファイルを探して読み込みます。

ただし、spark-submitを使用すると、Spark Clusterのクラスパスがアプリのクラスパスよりも優先されます。このため、このファイルをfat-jarに入れてもクラスタの設定が上書きされることはありません。

-Dlog4j.configuration=<location of configuration file>spark.driver.extraJavaOptionsを追加します(ドライバ用)または
spark.executor.extraJavaOptions(エグゼキュータ用)

ファイルを使用する場合は、file:プロトコル()を明示的に指定する必要があり、ファイルはすべてのノードにローカルに存在する必要があります。

最後の条件を満たすには、ファイルをノードで利用可能な場所(hdfsなど)にアップロードするか、deploy-mode clientを使用している場合はドライバでローカルにアクセスします。さもないと:

アプリケーションと一緒にアップロードするファイルのlog4j.propertiesリストに追加することによって、spark-submitを使用してカスタムの--filesをアップロードします。

出典: 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

クラスタモードの場合は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"

clientモードを使用する場合は--driver-Java-optionsを使用する必要があります。 Sparkドキュメント、Runtime env

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"

ノート:

  1. spark-clusterを使用して--filesにアップロードされたファイルはルートディレクトリで利用可能になるため、file:log4j.propertiesにパスを追加する必要はありません。
  2. --filesにリストされているファイルは絶対パスで提供されなければなりません!
  3. 構成URIのfile:プレフィックスは必須です。

#3クラスタの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

/var/lib/spark/latest/conf/log4j.propertiesを(方法#2の例で)編集するだけで、すべてのアプリがこの設定を共有します。


#4設定ディレクトリを上書きする

ソリューション#3が気に入っていても、アプリケーションごとにカスタマイズしたい場合は、実際にconfフォルダをコピーし、その内容を編集して、spark-submitのルート設定として指定することができます。

デフォルトの“SPARK_HOME/conf”以外の別の設定ディレクトリを指定するには、SPARK_CONF_DIRを設定できます。 Sparkはこのディレクトリから設定ファイル(spark-defaults.confspark-env.shlog4j.propertiesなど)を使用します。

出典: スパークドキュメント、設定

ステップ:

  1. クラスタのconfフォルダをコピーします(詳細、方法#3)
  2. そのフォルダのlog4j.propertiesを編集します(方法#2の例)
  3. 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"
    

結論

他の方法があるかどうか私にはわかりませんが、これがAからZまでのトピックをカバーすることを願っています。そうでなければ、コメントで私にpingを送ってください!

あなたのやり方を楽しんでください!

3
Atais

Spark-shell OR spark-submitコマンドにparamの下に追加するだけです。

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

Log4j.propertiesファイルから正確なプロパティー名(ここではlog4jspark.root.logger)を確認してください。これが助けになることを願っています、応援!

2
Gaurav Adurkar

面白いアイデアはここに示唆されるようにRollingAppenderを使うことです: http://shzhangji.com/blog/2015/05/31/spark-streaming-logging-configuration/ コンソールスペースを "汚染"しないようにしますが、それでも$ YOUR_LOG_PATH_HERE/$ {dm.logging.name} .logの下の結果を見ることができます。

    log4j.rootLogger=INFO, rolling

log4j.appender.rolling=org.Apache.log4j.RollingFileAppender
log4j.appender.rolling.layout=org.Apache.log4j.PatternLayout
log4j.appender.rolling.layout.conversionPattern=[%d] %p %m (%c)%n
log4j.appender.rolling.maxFileSize=50MB
log4j.appender.rolling.maxBackupIndex=5
log4j.appender.rolling.file=$YOUR_LOG_PATH_HERE/${dm.logging.name}.log
log4j.appender.rolling.encoding=UTF-8

原因を解決するもう1つの方法は、どのような種類のロギングがあるのか​​(異なるモジュールや依存関係に由来する)を観察し、ロギングの粒度を細かく設定しながら、冗長すぎる「静かな」サードパーティログを設定することです。

例えば、

    # Silence akka remoting
log4j.logger.Remoting=ERROR
log4j.logger.akka.event.slf4j=ERROR
log4j.logger.org.spark-project.jetty.server=ERROR
log4j.logger.org.Apache.spark=ERROR
log4j.logger.com.anjuke.dm=${dm.logging.level}
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
2
marilena.oita

コマンドラインで簡単に...

spark2-submit --driver-Java-options="-Droot.logger=ERROR,console" ..その他のオプション..

1
1472580

Javaコードを編集して.setLogLevel()ステートメントを挿入する機能がなく、さらに多くの外部ファイルをデプロイしたくない場合は、これを解決するために強引な方法を使用できます。 grepを使ってINFO行を取り除いてください。

spark-submit --deploy-mode client --master local <rest-of-cmd> | grep -v -F "INFO"
0
swdev
  1. 他のlog4j.rootCategory = ERROR、コンソールの説明に従ってconf/log4j.propertiesを調整します。
  2. スパークジョブの実行中に、log4j.propertiesファイルパスを使用して--fileフラグを渡すようにしてください。
  3. それでもうまくいかない場合は、新しいlog4j.propertiesの前に呼び出されているlog4j.propertiesを含むjarファイルがある可能性があります。 log4j.propertiesをjarから削除します(適切な場合)
0
user5736891

これは私のために働いた。 ERRORメッセージのみをstdoutとして表示するには、log4j.propertiesファイルは次のようになります。

# Root logger option
log4j.rootLogger=ERROR, stdout
# Direct log messages to stdout
log4j.appender.stdout=org.Apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.Apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

注:有効にするには、log4j.propertiesファイルをsrc/main/resourcesフォルダーに入れてください。 log4j.propertiesが存在しない場合(sparklog4j-defaults.propertiesファイルを使用していることを意味します)は、SPARK_HOME/conf、次にmv log4j.properties.template log4j.propertiesに移動して上記の変更を続けることで作成できます。

0
RPaul
sparkContext.setLogLevel("OFF")
0
Art

他の誰かがこれにこだわっている場合、

上記のどれも私にとってはうまくいきませんでした。削除しなければならなかった

implementation group: "ch.qos.logback", name: "logback-classic", version: "1.2.3"
implementation group: 'com.typesafe.scala-logging', name: "scala-logging_$scalaVersion", version: '3.9.2'

私のbuild.gradleからログが消えます。 TLDR:他のロギングフレームワークをインポートしないでください。org.Apache.log4j.Loggerを使用するだけで問題ありません。

0
Falco Winkler

上記のすべての投稿に加えて、これが私のために問題を解決したものです。

Sparkはロガーにバインドするためにslf4jを使用します。 log4jが最初に見つかったバインディングではない場合は、必要なすべてのlog4j.propertiesファイルを編集できます。ロガーも使用されません。例えば、これはSLF4J出力の可能性があります。

SLF4J:クラスパスに複数のSLF4Jバインディングが含まれています。 SLF4J:[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:[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:詳しくは、 http://www.slf4j.org/codes.html#multiple_bindings を参照してください。説明。 SLF4J:実際のバインディングは[org.slf4j.impl.SimpleLoggerFactory]型です。

そのため、ここではSimpleLoggerFactoryが使用されていますが、これはlog4jの設定には関係ありません。

私のプロジェクトからslf4j-simpleパッケージを除外します。

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

log4jロガーバインディングが使用され、log4j.properties内のすべての設定が順守されるようになったため、問題は解決しました。 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

お役に立てれば!

0
daniel.wirtz