私は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
どうやってこれらを止めるのですか?
.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)
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)
その後、ログは表示されません。
レベルのその他のオプションには、all
、debug
、error
、fatal
、info
、off
、trace
、trace_int
、warn
spark-Shell
型を起動した直後。
sc.setLogLevel("ERROR")
Spark 2.0では:
spark = SparkSession.builder.getOrCreate()
spark.sparkContext.setLogLevel("ERROR")
以下のコマンドを使用して、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を使用して設定をリロードします。
次のようにログを無効に設定してログを無効にします。
Logger.getLogger("org").setLevel(Level.OFF);
Logger.getLogger("akka").setLevel(Level.OFF);
または、ログファイルを編集し、次のプロパティを変更してログレベルをオフに設定します。
log4j.rootCategory=OFF, console
インポートステートメントのすぐ下にあるすべてのpysparkスクリプトにこの行を追加します。
SparkSession.builder.getOrCreate().sparkContext.setLogLevel("ERROR")
私のpysparkスクリプトのヘッダ例
from pyspark.sql import SparkSession, functions as fs
SparkSession.builder.getOrCreate().sparkContext.setLogLevel("ERROR")
上記の答えは正しいですが、必要な追加情報があるため、正確には役に立ちませんでした。
Log4jファイルにまだ '.template'接尾辞が付いていて、読み取られていないように、Sparkをセットアップしました。私はロギングがデフォルトでSparkコアロギングconfになると信じています。
あなたが私のようで、上記の答えが役に立たなかったとわかったら、多分あなたもあなたのlog4j confファイルから '.template'接尾辞を取り除かなければならない、そしてそれから上記は完全にうまくいく!
http://Apache-spark-user-list.1001560.n3.nabble.com/disable-log4j-for-spark-Shell-td11278.html
スパークコンテキストの場合は、次のものを使用できます。
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
に設定できます。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)
ロギングを完全に無効にするには、conf/log4j.properties
で以下を使用します。
log4j.logger.org=OFF
参考:Jacek Laskowskiによるスパークの習得。
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)
実際には、それには多くの方法があります。他の人よりも難しい人もいますが、どちらがあなたに最も適しているかはあなた次第です。私はそれらすべてを紹介しようとします。
最も簡単に思えますが、これらの設定を変更するにはアプリを再コンパイルする必要があります。個人的には、好きではありませんが、うまくいきます。
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構成文書 、構成セクション]
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
をアップロードします。
例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"
spark-cluster
を使用して--files
にアップロードされたファイルはルートディレクトリで利用可能になるため、file:log4j.properties
にパスを追加する必要はありません。--files
にリストされているファイルは絶対パスで提供されなければなりません!file:
プレフィックスは必須です。conf/log4j.properties
を編集するこれはグローバルロギング設定ファイルを変更します。
$SPARK_CONF_DIR/log4j.properties
ファイルを更新すると、他の設定とともに自動的にアップロードされます。
あなたの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の例で)編集するだけで、すべてのアプリがこの設定を共有します。
ソリューション#3が気に入っていても、アプリケーションごとにカスタマイズしたい場合は、実際にconf
フォルダをコピーし、その内容を編集して、spark-submit
のルート設定として指定することができます。
デフォルトの
“SPARK_HOME/conf”
以外の別の設定ディレクトリを指定するには、SPARK_CONF_DIR
を設定できます。 Sparkはこのディレクトリから設定ファイル(spark-defaults.conf
、spark-env.sh
、log4j.properties
、など)を使用します。
出典: スパークドキュメント、設定
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"
他の方法があるかどうか私にはわかりませんが、これがAからZまでのトピックをカバーすることを願っています。そうでなければ、コメントで私にpingを送ってください!
あなたのやり方を楽しんでください!
Spark-shell OR spark-submitコマンドにparamの下に追加するだけです。
--conf "spark.driver.extraJavaOptions=-Dlog4jspark.root.logger=WARN,console"
Log4j.propertiesファイルから正確なプロパティー名(ここではlog4jspark.root.logger)を確認してください。これが助けになることを願っています、応援!
面白いアイデアはここに示唆されるように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
コマンドラインで簡単に...
spark2-submit --driver-Java-options="-Droot.logger=ERROR,console"
..その他のオプション..
Javaコードを編集して.setLogLevel()
ステートメントを挿入する機能がなく、さらに多くの外部ファイルをデプロイしたくない場合は、これを解決するために強引な方法を使用できます。 grepを使ってINFO行を取り除いてください。
spark-submit --deploy-mode client --master local <rest-of-cmd> | grep -v -F "INFO"
これは私のために働いた。 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
が存在しない場合(spark
がlog4j-defaults.properties
ファイルを使用していることを意味します)は、SPARK_HOME/conf
、次にmv log4j.properties.template log4j.properties
に移動して上記の変更を続けることで作成できます。
sparkContext.setLogLevel("OFF")
他の誰かがこれにこだわっている場合、
上記のどれも私にとってはうまくいきませんでした。削除しなければならなかった
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
を使用するだけで問題ありません。
上記のすべての投稿に加えて、これが私のために問題を解決したものです。
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
お役に立てれば!