Kıvılcım konsolunda INFO mesajlarının görüntülenmesi nasıl durdurulur?


181

Kıvılcım kabuğuna gelen çeşitli mesajları durdurmak istiyorum.

log4j.propertiesBu mesajı durdurmak için dosyayı düzenlemeye çalıştım .

İşte içeriği 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

Ancak iletiler hala konsolda görüntüleniyor.

İşte bazı örnek mesajlar

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

Bunları nasıl durdurabilirim?

Yanıtlar:


168

Senin düzenleyin conf/log4j.propertiesdosya ve aşağıdaki satırı değiştirin:

log4j.rootCategory=INFO, console

için

log4j.rootCategory=ERROR, console

Başka bir yaklaşım:

Kıvılcım kabuğunu başlatın ve aşağıdakileri yazın:

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

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

Bundan sonra herhangi bir günlük görmeyeceksiniz.

Seviye için diğer seçenekler şunlardır: all, debug, error, fatal, info, off, trace, trace_int,warn

Her biri hakkında detaylar dokümantasyonda bulunabilir.


15
OFF'un çok kısıtlayıcı olduğunu düşünüyorum. UYARI veya HATA buraya daha iyi uyabilir.
snowindy

2
Bunu projelerinize ekleyin Ana sınıf.
AkhlD

2
Mükemmel cevap. Aynı şeyi PySpark'tan programlı olarak yapmanın herhangi bir yolu var mı?
Tagar

2
Bunun programlı kısmı çalışmıyor. Bunun yerine şu yanıtı @cantdutchthis stackoverflow.com/a/37836847/1056563
javadba

1
Bu kim @AkhlD?
Aviad Klein

151

Başlangıç spark-shelltipinden hemen sonra ;

sc.setLogLevel("ERROR")

Spark 2.0'da (Scala):

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

API Dokümanları: https://spark.apache.org/docs/2.2.0/api/scala/index.html#org.apache.spark.sql.SparkSession

Java için:

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

Bu özelliği bir programda nasıl ayarlarsınız?
Alex Raj Kaliamoorthy

Bu sadece spark.sql.SparkSession için ya da JavaSparkContext için avaibale ??
SharpLu

Evet, JavaSparkContext için kullanılabilir . Teşekkürler, @cantdutchthis. Bu beni bir süre rahatsız etti.
alan

1
Ayrı bir log4j oluşturmadan benim için çalışan tek cevap bu. Teşekkürler!
abhihello123

2
Benim için işe yarıyor, ancak testimin başında hala birkaç mesaj alıyorum. Herhangi bir fikir?

46

@AkhlD ve @Sachin Janani .confdosyalarındaki değişiklikleri önerdikleri için teşekkürler .

Aşağıdaki kod sorunumu çözdü:

1) import org.apache.log4j.{Level, Logger}İçe aktarma bölümüne eklendi

2) Kıvılcım bağlamı nesnesinin oluşturulmasından sonra aşağıdaki satır eklenmiştir val sc = new SparkContext(conf):

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

12
Bunu denedim ama yine de günlük çıktılarını alıyorum.
horatio1701d

1
Conf erişim izni olmayan bu çözümü seviyorum /
Jim Ho

31

Spark-send veya spark-sql kullanarak uygulama gönderirken günlük seviyesini değiştirmek için aşağıdaki komutu kullanın:

spark-submit \
--conf "spark.driver.extraJavaOptions=-Dlog4j.configuration=file:<file path>/log4j.xml" \
--conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file:<file path>/log4j.xml"

Not: yapılandırma dosyasının saklandığı <file path>yeri değiştirin 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>

Konsol yerine dosyaya günlük yazmak istiyorsanız log4j.xml dosyasında FileAppender'a geçin. LOG_DIRkullanarak sağlayabileceğiniz günlükler dizini için bir değişkendir 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>

Burada anlaşılması gereken bir diğer önemli şey, iş dağıtılmış modda başlatıldığında (konuşlandırma modu kümesi ve iplik veya mezos olarak master) log4j yapılandırma dosyasının sürücü ve çalışan düğümlerde ( log4j.configuration=file:<file path>/log4j.xml) bulunması gerekir, aksi takdirde log4j init şikayet edecek-

log4j: HATA [log4j.properties] yapılandırma dosyası okunamadı. java.io.FileNotFoundException: log4j.properties (Böyle bir dosya veya dizin yok)

Bu sorunu çözme konusunda ipucu

Log4j yapılandırma dosyasını dağıtılmış dosya sisteminde (HDFS veya mezos) tutun ve log4j PropertyConfigurator kullanarak harici yapılandırma ekleyin . veya her düğümde kullanılabilir duruma getirmek için sparkContext addFile kullanın ve ardından yapılandırmayı yeniden yüklemek için log4j PropertyConfigurator'ı kullanın.


2
Bu, orggeleneksel olarak varsayılan günlükçüdeki tüm günlükleri tıkamayan birkaç örnekten biridir .
deepelement

1
Bu çok iyi çalışıyor, ama Log4j.propertiesdosya ne için? Kullanıldığı görülmüyor. Sadece XML dosyasında ayarlanmış özellikleri belgeliyor musunuz?
vy32

1
Bunlardan herhangi birini kullanabilirsiniz.
Rahul Sharma

3
Yukarıdakilerle başarı elde ettim - --fileslog4j.properties'i tüm düğümlerde kullanılabilir hale getirmek için kıvılcım gönderme komutunda kullanıyorum.
Ben Watson

1
Bu benim için çalışan tek çözüm ve herhangi bir kod değişikliği içermiyor. Mevcut olmaması durumunda Log4.propertiesaltında bir dosya oluşturunmain/resources
Yeikel

30

Örneklerle toplanan tüm yöntemler

giriş

Aslında bunu yapmanın birçok yolu var . Bazıları diğerlerinden daha zordur, ancak hangisinin size en uygun olduğuna bağlıdır. Hepsini sergilemeye çalışacağım.


1. Uygulamanızda programlı olarak

En kolay gibi görünüyor, ancak bu ayarları değiştirmek için uygulamanızı yeniden derlemeniz gerekecek. Şahsen, sevmiyorum ama iyi çalışıyor.

Misal:

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)

Sadece log4jAPI kullanarak çok daha fazlasını başarabilirsiniz .
Kaynak: [ Log4J Yapılandırma Dokümanları , Yapılandırma bölümü]


# 2 Geçiş log4j.propertiessırasındaspark-submit

Bu çok zor ama imkansız değil. Ve benim favorim.

Uygulama başlatma sırasında Log4J her zaman log4j.propertiessınıf yolundan dosya arar ve yükler .

Ancak, spark-submitSpark Cluster'ın sınıfyolunu kullanırken uygulamanın sınıfyoluna göre önceliği vardır! Bu yüzden bu dosyayı yağ kavanozunuza koymak, kümenin ayarlarını geçersiz kılmaz!

Ekle -Dlog4j.configuration=<location of configuration file>için spark.driver.extraJavaOptions (sürücü için) veya
spark.executor.extraJavaOptions (uygulayıcıları için) .

Bir dosya kullanılıyorsa, file:protokolün açıkça sağlanması ve dosyanın tüm düğümlerde yerel olarak bulunması gerektiğini unutmayın .

Son koşulu yerine getirmek için, dosyayı düğümler için kullanılabilir konuma yükleyebilir (beğen hdfs) veya kullanıyorsanız sürücü ile yerel olarak erişebilirsiniz deploy-mode client. Aksi takdirde:

uygulama ile yüklenecek dosyalar listesine log4j.propertiesekleyerek kıvılcım-gönderme özelliğini kullanarak özel bir --filesdosya yükleyin.

Kaynak: Spark belgeleri, Hata ayıklama

Adımlar:

Örnek 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-submitKüme modu için yürütme :

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"

Mod --driver-java-optionskullanıyorsanız kullanmanız gerektiğini unutmayın client. Spark docs, Çalışma Zamanı env

spark-submitİstemci modu için yürütme :

spark-submit \
    --master yarn \
    --deploy-mode client \
    --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"

Notlar:

  1. Dosyalar yüklenen spark-clusterile --fileskök dir mevcut olacaktır, bu nedenle herhangi bir yolu eklemeye gerek yokturfile:log4j.properties .
  2. Listelenen dosyalar --filesmutlak yol ile sağlanmalıdır!
  3. file: yapılandırma URI'sinde önek zorunludur.

# 3 Kümeleri düzenleyin conf/log4j.properties

Bu, genel günlük yapılandırma dosyasını değiştirir .

$SPARK_CONF_DIR/log4j.propertiesdosyayı güncellediğinizde diğer yapılandırmalarla birlikte otomatik olarak yüklenecektir.

Kaynak: Spark belgeleri, Hata ayıklama

Kendinizi bulmak için SPARK_CONF_DIRşunları kullanabilirsiniz 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

Şimdi düzenleyin /var/lib/spark/latest/conf/log4j.properties(yöntem # 2'deki örnekle) ve tüm uygulamalarınız bu yapılandırmayı paylaşacaktır.


# 4 Yapılandırma dizinini geçersiz kıl

3. çözümü beğendiyseniz, ancak uygulama başına özelleştirmek istiyorsanız, aslında confklasörü kopyalayabilir, içeriğini düzenleyebilir ve sırasında kök yapılandırması olarak belirtebilirsiniz spark-submit.

Varsayılandan farklı bir yapılandırma dizini belirtmek için “SPARK_HOME/conf”ayarlayabilirsiniz SPARK_CONF_DIR. Kıvılcım (yapılandırma dosyaları kullanacak spark-defaults.conf, spark-env.sh, log4j.properties, vb bu dizinden).

Kaynak: Spark belgeleri, Yapılandırma

Adımlar:

  1. Kümeleri kopyala conf klasörünü (daha fazla bilgi, yöntem # 3)
  2. Düzenle log4j.properties bu klasör içinde (yöntem # örnek 2)
  3. Yürütmeden SPARK_CONF_DIRönce bu klasöre ayarlayın spark-submit,
    örnek:

    export SPARK_CONF_DIR=/absolute/path/to/custom/conf
    
    spark-submit \
        --master yarn \
        --deploy-mode cluster \
        --class com.github.atais.Main \
        "SparkApp.jar"
    

Sonuç

Başka bir yöntem olup olmadığından emin değilim, ama umarım bu A'dan Z'ye konuyu kapsar. Değilse, yorumlarda bana ping yapmaktan çekinmeyin!

Yolunuzun tadını çıkarın!


Bu kabul edilen cevap olmalı. Daha fazla ayrıntı sunuyor ve diğerlerinden çok daha fazla kullanım durumunu özetliyor. (Günlükleri devre dışı bırakmaya teşvik etmeden.)
belgacea

@Atais - Aşağıya eklemelisiniz Eğer benim gibi iseniz ve yukarıdaki cevapların yardımcı olmadığını bulursanız, belki de '.template' son ekini log4j conf dosyanızdan kaldırmanız gerekir ve sonra yukarıdakiler mükemmel çalışır!
oneday

1
Programlı yaklaşım hakkında ek not
Seviye

Günlük kaydı SparkContext'e bağlı olmayan ayrı bir özellik olduğundan, @ArunrajNair durum böyle olmamalıdır.
Atais

19

Günlükleri devre dışı bırakarak düzeyini aşağıdaki gibi KAPALI olarak ayarlayabilirsiniz:

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

veya aşağıdaki dosyayı değiştirerek günlük dosyasını düzenleyin ve günlük düzeyini kapalı olarak ayarlayın:

log4j.rootCategory=OFF, console

Hangi dosyada özellikleri yukarıda ayarlıyorum ??
Vishwas

Bu satırları Sürücü programınıza @Vishwas
Sachin Janani

Aynı şeyi ekledim ama yine de günlükler konsolda görünüyor
Vishwas

Log4j.rootCategory = OFF özelliğini değiştirdiniz mi? Bunları
sonumda

3
Bu kıvılcım 2.3.1 benim için sıfır fark
Toby Eggitt

15

Bu satırı, ithalat ifadelerinin hemen altındaki tüm pyspark komut dosyalarına ekliyorum.

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

pyspark scriptlerimin örnek başlığı

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

13
Bu işe yarar, ancak Spark bağlamının oluşturulması sırasında ortaya çıkan 58 satırlık INFO mesajını durdurmaz.
vy32

1
Bunun Spark 2.x için olduğunu unutmayın
Yeikel

13

Yukarıdaki yanıtlar doğrudur, ancak gerekli ek bilgiler olduğu için bana tam olarak yardımcı olmadı.

Ben sadece Spark4 log4j dosya hala '.template' soneki vardı ve okunmuyordu kurulum var. Günlüğe kaydetmenin varsayılan olarak Spark çekirdek günlüğü conf ayarını değiştirdiğine inanıyorum.

Eğer benim gibi iseniz ve yukarıdaki cevapların yardımcı olmadığını bulursanız, belki de '.template' sonekini log4j conf dosyanızdan kaldırmanız gerekir ve sonra yukarıdaki mükemmel çalışır!

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


Lütfen bu yanıtı kontrol edin, stackoverflow.com/a/51554118/2094086 aynısını aradığınızı umuyoruz.
Gaurav Adurkar

5

Python / Spark'da şunları yapabiliriz:

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' tanımlandıktan sonra bu işlevi şöyle çağırır: quiet_logs (sc)


Log4j dosyasıyla uğraşmadan çalışan programlı bir yol bulmak isterim - ancak bunu denediğimde hala WARN org.apache.spark.scheduler.TaskSetManager: Görev 612.1'i aşama 0.0'da (TID 2570) kaybettim ..., yönetici 15): TaskKilled (başka bir girişim
MrCartoonology

5

tl; Dr.

Spark Context için şunları kullanabilirsiniz:

sc.setLogLevel(<logLevel>)

loglevelTÜM, HATA AYIKLAMA, HATA, FATAL, BİLGİ, KAPALI, İZLEME veya UYARI nerede olabilir.


ayrıntıları-

Dahili olarak, daha sonra kullanarak ayarlamak için kullandığı setLogLevelçağrılar .org.apache.log4j.Level.toLevel(logLevel)org.apache.log4j.LogManager.getRootLogger().setLevel(level)

Günlük düzeylerini aşağıdakileri OFFkullanarak doğrudan ayarlayabilirsiniz :

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

Spark kabuğu için varsayılan günlüğü ayarlayabilirsiniz conf/log4j.properties. conf/log4j.properties.templateBaşlangıç ​​noktası olarak kullanın .

Spark Uygulamalarında Günlük Düzeylerini Ayarlama

Bağımsız Spark uygulamalarında veya Spark Shell oturumundayken aşağıdakileri kullanın:

import org.apache.log4j.{Level, Logger}

Logger.getLogger(classOf[RackResolver]).getLevel
Logger.getLogger("org").setLevel(Level.OFF)
Logger.getLogger("akka").setLevel(Level.OFF)

Günlüğe kaydetmeyi devre dışı bırakma (log4j'de):

conf/log4j.propertiesGünlüğe kaydetmeyi tamamen devre dışı bırakmak için aşağıdakileri kullanın :

log4j.logger.org=OFF

Kaynak: Spark Master, Jacek Laskowski.


3

Komut satırında basit ...

spark2-submit --driver-java-options="-Droot.logger=ERROR,console" ..diğer seçenekler..


nedir spark2-submit?
vy32

kıvılcım2-gönder Kıvılcım2 için kullanılır.
Nephilim

3

Kıvılcım kabuğu VEYA kıvılcım gönderme komutunuza aşağıdaki parametreyi ekleyin

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

Log4j.properties dosyasından tam özellik adını (log4jspark.root.logger burada) kontrol edin. Umarım bu yardımcı olur, şerefe!


1
Bunu komut satırından ayarlamak harika olurdu. Ama bu benim için işe yaramadı.
swdev

2

İlginç bir fikir, RollingAppender'ı burada önerildiği gibi kullanmaktır: http://shzhangji.com/blog/2015/05/31/spark-streaming-logging-configuration/, böylece konsol alanını "kirletmemek", ancak yine de sonuçları $ YOUR_LOG_PATH_HERE / $ {dm.logging.name} .log altında görebilirsiniz.

    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

Nedeni çözen bir başka yöntem, genellikle ne tür günlüklere sahip olduğunuzu gözlemlemektir (farklı modüllerden ve bağımlılıklardan gelir) ve çok ayrıntılı olan "sessiz" üçüncü taraf günlüklerini çevirirken günlük kaydı için her bir ayrıntı düzeyi için ayarlamanızdır:

Örneğin,

    # 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

0
  1. Conf / log4j.properties öğesini diğer log4j.rootCategory = ERROR, konsol tarafından açıklandığı şekilde ayarlayın
  2. Kıvılcım işinizi yürütürken log4j.properties dosya yolu ile --file bayrağını ilettiğinizden emin olun
  3. Hala çalışmıyorsa, yeni log4j.properties öğesinden önce çağrılan log4j.properties içeren bir kavanozunuz olabilir. Bu log4j.properties'i kavanozdan çıkarın (uygunsa)

0
sparkContext.setLogLevel("OFF")

1
Ben both- log4j.properties gelen .template eki kaldırılır ve HATA'dan seviyesini ayarlamak ve did val rootLogger = Logger.getRootLogger() rootLogger.setLevel(Level.ERROR) İşe yaradı
Sam-T

0

Yukarıdaki tüm yazılara ek olarak, sorunu benim için çözen şey şu.

Spark, günlükçilere bağlanmak için slf4j kullanır. Log4j, bulunan ilk ciltleme değilse, log4j.properties dosyalarını istediğiniz gibi düzenleyebilirsiniz, kaydediciler bile kullanılmaz. Örneğin, bu olası bir SLF4J çıkışı olabilir:

SLF4J: Sınıf yolu, birden çok SLF4J bağlama içeriyor. SLF4J: [jar: dosya: / 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 içinde ciltleme bulundu ! /org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Açıklama için bkz. http://www.slf4j.org/codes.html#multiple_bindings . SLF4J: Gerçek bağlama [org.slf4j.impl.SimpleLoggerFactory] türündedir.

Yani burada log4j ayarlarını önemsemeyen SimpleLoggerFactory kullanıldı.

Slf4j-simple paketini projemden

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

log4j logger bağlaması kullanıldığından ve log4j.properties dosyasındaki herhangi bir ayara uyulduğu için bu sorunu çözdü. FYI benim log4j özellikler dosyamda (normal yapılandırmanın yanında)

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

Bu yardımcı olur umarım!


0

Bu benim için çalıştı. Sadece HATA mesajları olarak gösterilmesi için stdout, log4j.propertiesdosya gibi görünebilir:

# 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

NOT: Etkili olması için log4j.propertiesdosyayı src/main/resourcesklasöre koyun . Ve log4j.propertiesyoksa (yani dosya sparkkullanmaktır log4j-defaults.properties), o SPARK_HOME/confzaman mv log4j.properties.template log4j.propertiesve sonra söz konusu değişikliklere giderek dosyayı oluşturabilirsiniz .


0

.setLogLevel()İfadeleri eklemek için java kodunu düzenleme yeteneğiniz yoksa ve daha fazla harici dosyanın dağıtılmasını istemiyorsanız, bunu çözmek için kaba bir kuvvet yolu kullanabilirsiniz. Sadece grep kullanarak INFO satırlarını filtreleyin.

spark-submit --deploy-mode client --master local <rest-of-cmd> | grep -v -F "INFO"

0

Eğer başka biri buna takılırsa,

yukarıdakilerin hiçbiri benim için işe yaramadı. Kaldırmak zorunda kaldım

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'

günlüklerin kaybolması için derlememden. TLDR: Başka kayıt çerçevelerini içe aktarmayın, sadeceorg.apache.log4j.Logger


0

Günlükleri tamamen durdurmanın başka bir yolu:

    import org.apache.log4j.Appender;
    import org.apache.log4j.BasicConfigurator;
    import org.apache.log4j.varia.NullAppender;

    public class SomeClass {

        public static void main(String[] args) {
            Appender nullAppender = new NullAppender();
            BasicConfigurator.configure(nullAppender);

            {...more code here...}

        }
    }

Bu benim için çalıştı. Bir NullAppender

Günlük olaylarını yok sayan bir Appender. ( https://logging.apache.org/log4j/2.x/log4j-core/apidocs/org/apache/logging/log4j/core/appender/NullAppender.html )

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.