Chciałbym zatrzymać różne komunikaty, które pojawiają się w powłoce iskry.
Próbowałem edytować log4j.properties
plik, aby zatrzymać te komunikaty.
Oto zawartość 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
Ale komunikaty nadal są wyświetlane na konsoli.
Oto kilka przykładowych wiadomości
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
Jak to zatrzymać?
apache-spark
log4j
spark-submit
Vishwas
źródło
źródło
Zaraz po uruchomieniu
spark-shell
typu;W Spark 2.0 (Scala):
Dokumenty API: https://spark.apache.org/docs/2.2.0/api/scala/index.html#org.apache.spark.sql.SparkSession
W przypadku języka Java:
źródło
Dzięki @AkhlD i @Sachin Janani za sugestie zmian w
.conf
pliku.Poniższy kod rozwiązał mój problem:
1) Dodano
import org.apache.log4j.{Level, Logger}
w sekcji importu2) Dodano następujący wiersz po utworzeniu obiektu kontekstu iskry, czyli po
val sc = new SparkContext(conf)
:źródło
Użyj poniższego polecenia, aby zmienić poziom dziennika podczas składania wniosku przy użyciu funkcji spark-submit lub spark-sql:
Uwaga: wymień
<file path>
gdzielog4j
przechowywany jest plik konfiguracyjny.Log4j.properties:
log4j.xml
Przełącz się do FileAppender w log4j.xml, jeśli chcesz zapisywać dzienniki w pliku zamiast w konsoli.
LOG_DIR
jest zmienną dla katalogu logów, którą możesz podać za pomocąspark-submit --conf "spark.driver.extraJavaOptions=-D
.Inną ważną rzeczą do zrozumienia jest to, że gdy zadanie jest uruchamiane w trybie rozproszonym (klaster w trybie wdrażania i master jako przędza lub mesos), plik konfiguracyjny log4j powinien istnieć w węzłach sterownika i węzła roboczego (
log4j.configuration=file:<file path>/log4j.xml
), w przeciwnym razie log4j init będzie narzekał.Wskazówka dotycząca rozwiązania tego problemu-
Zachowaj plik konfiguracyjny log4j w rozproszonym systemie plików (HDFS lub mesos) i dodaj konfigurację zewnętrzną za pomocą narzędzia log4j PropertyConfigurator . lub użyj funkcji sparkContext addFile, aby udostępnić ją w każdym węźle, a następnie użyj narzędzia log4j PropertyConfigurator do ponownego załadowania konfiguracji.
źródło
org
dzienników, które tradycyjnie pochodzą z domyślnego programu rejestrującego.Log4j.properties
plik? Wydaje się, że nie jest używany. Czy po prostu dokumentujesz właściwości ustawione w pliku XML?--files
w poleceniu spark-submit, aby udostępnić log4j.properties na wszystkich węzłach.Log4.properties
podmain/resources
na wypadek, gdyby nie istniałWszystkie metody zebrane z przykładami
Intro
Właściwie jest na to wiele sposobów . Niektóre są trudniejsze od innych, ale od Ciebie zależy, który z nich najbardziej Ci odpowiada. Postaram się je wszystkie pokazać.
# 1 Programowo w Twojej aplikacji
Wydaje się, że jest to najłatwiejsze, ale musisz ponownie skompilować aplikację, aby zmienić te ustawienia. Osobiście mi się to nie podoba, ale działa dobrze.
Przykład:
Dzięki
log4j
API możesz osiągnąć znacznie więcej .Źródło: [ Log4J Configuration Docs , Configuration section]
# 2 Pass w
log4j.properties
trakciespark-submit
To jest bardzo trudne, ale nie niemożliwe. I mój ulubiony.
Log4J podczas uruchamiania aplikacji zawsze szuka i ładuje
log4j.properties
plik ze ścieżki klasy.Jednak w przypadku korzystania
spark-submit
ze ścieżki klas Spark Clustera ma pierwszeństwo przed ścieżką klas aplikacji! Dlatego umieszczenie tego pliku w Twoim fat-jar nie nadpisuje ustawień klastra!Aby spełnić ostatni warunek, możesz przesłać plik do lokalizacji dostępnej dla węzłów (np.
hdfs
) Lub uzyskać do niego dostęp lokalnie za pomocą sterownika, jeśli używaszdeploy-mode client
. Inaczej:Źródło: dokumentacja Spark, debugowanie
Kroki:
Przykład
log4j.properties
:Wykonywanie
spark-submit
, dla trybu klastra:Pamiętaj, że musisz użyć,
--driver-java-options
jeśli używaszclient
trybu.Spark docs, środowisko wykonawcze środowiska uruchomieniowegoWykonywanie
spark-submit
, dla trybu klienta:Uwagi:
spark-cluster
z--files
będą dostępne w głównym katalogu, więc nie ma potrzeby, aby dodać dowolną ścieżkęfile:log4j.properties
.--files
muszą mieć bezwzględną ścieżkę!file:
prefiks w identyfikatorze URI konfiguracji jest obowiązkowy.# 3 Edytuj klaster
conf/log4j.properties
Spowoduje to zmianę pliku konfiguracji globalnego rejestrowania .
Źródło: dokumentacja Spark, debugowanie
Aby znaleźć swój
SPARK_CONF_DIR
, możesz użyćspark-shell
:Teraz po prostu edytuj
/var/lib/spark/latest/conf/log4j.properties
(przykład z metody nr 2), a wszystkie Twoje aplikacje będą współdzielić tę konfigurację.# 4 Zastąp katalog konfiguracji
Jeśli podoba Ci się rozwiązanie nr 3, ale chcesz dostosować je do poszczególnych aplikacji, możesz skopiować
conf
folder, edytować jego zawartość i określić jako konfigurację główną podczasspark-submit
.Źródło: dokumentacja Spark, konfiguracja
Kroki:
conf
folder (więcej informacji, metoda nr 3)log4j.properties
w tym folderze (przykład w metodzie nr 2)Ustaw
SPARK_CONF_DIR
na ten folder, przed wykonaniemspark-submit
,przykład:
Wniosek
Nie jestem pewien, czy istnieje inna metoda, ale mam nadzieję, że obejmuje ona temat od A do Z. Jeśli nie, pisz do mnie w komentarzach!
Ciesz się swoją drogą!
źródło
Aby wyłączyć dzienniki, należy ustawić jego poziom na WYŁ. W następujący sposób:
lub edytuj plik dziennika i wyłącz poziom logowania, zmieniając po prostu następującą właściwość:
źródło
Po prostu dodaję tę linię do wszystkich moich skryptów pyspark na górze tuż pod instrukcjami importu.
przykładowy nagłówek moich skryptów pyspark
źródło
Powyższe odpowiedzi są poprawne, ale nie pomogły mi, ponieważ potrzebowałem dodatkowych informacji.
Właśnie skonfigurowałem Sparka, więc plik log4j nadal miał sufiks „.template” i nie był odczytywany. Uważam, że rejestrowanie jest wtedy domyślnie ustawione na Spark core logging conf.
Więc jeśli jesteś podobny do mnie i stwierdzisz, że powyższe odpowiedzi nie pomogły, być może Ty też musisz usunąć sufiks „.template” z pliku conf log4j, a wtedy powyższe działa doskonale!
http://apache-spark-user-list.1001560.n3.nabble.com/disable-log4j-for-spark-shell-td11278.html
źródło
W Python / Spark możemy:
Po zdefiniowaniu Sparkcontaxt 'sc' wywołaj tę funkcję przez: quiet_logs (sc)
źródło
tl; dr
Detale-
Wewnętrznie
setLogLevel
wywołujeorg.apache.log4j.Level.toLevel(logLevel)
, których następnie używa do ustawiania usingorg.apache.log4j.LogManager.getRootLogger().setLevel(level)
.Możesz skonfigurować domyślne rejestrowanie dla powłoki Spark w
conf/log4j.properties
. Użyjconf/log4j.properties.template
jako punktu wyjścia.Ustawianie poziomów dzienników w aplikacjach Spark
W autonomicznych aplikacjach Spark lub podczas sesji Spark Shell użyj następujących elementów:
Wyłączanie logowania (w log4j):
conf/log4j.properties
Aby całkowicie wyłączyć rejestrowanie, użyj następujących poleceń:Literatura: Mastering Spark by Jacek Laskowski.
źródło
Proste do zrobienia w wierszu poleceń ...
spark2-submit --driver-java-options="-Droot.logger=ERROR,console"
..inne opcje..źródło
spark2-submit
?Po prostu dodaj poniższy parametr do polecenia spark-shell LUB spark-submit
Sprawdź dokładną nazwę właściwości (tutaj log4jspark.root.logger) z pliku log4j.properties. Mam nadzieję, że to pomoże!
źródło
Ciekawym pomysłem jest użycie RollingAppendera zgodnie z sugestią tutaj: http://shzhangji.com/blog/2015/05/31/spark-streaming-logging-configuration/ , aby nie „polutować” przestrzeni konsoli, ale nadal można zobaczyć wyniki w $ YOUR_LOG_PATH_HERE / $ {dm.logging.name} .log.
Inną metodą, która rozwiązuje tę przyczynę, jest obserwacja, jakiego rodzaju logi zwykle masz (pochodzące z różnych modułów i zależności) i ustawienie dla każdego z nich szczegółowości rejestrowania, jednocześnie zmieniając „ciche” dzienniki stron trzecich, które są zbyt szczegółowe:
Na przykład,
źródło
źródło
źródło
val rootLogger = Logger.getRootLogger() rootLogger.setLevel(Level.ERROR)
zadziałałoOprócz wszystkich powyższych postów, oto, co rozwiązało problem.
Spark używa slf4j do tworzenia powiązań z rejestratorami. Jeśli log4j nie jest pierwszym znalezionym powiązaniem, możesz edytować pliki log4j.properties, ile chcesz, programy rejestrujące nie są nawet używane. Na przykład może to być możliwe wyjście SLF4J:
Więc tutaj wykorzystano SimpleLoggerFactory, który nie dba o ustawienia log4j.
Wykluczając pakiet slf4j-simple z mojego projektu za pośrednictwem
rozwiązano ten problem, ponieważ teraz jest używane powiązanie programu rejestrującego log4j i są przestrzegane wszelkie ustawienia w log4j.properties. Do Twojej wiadomości mój plik właściwości log4j zawiera (oprócz normalnej konfiguracji)
Mam nadzieję że to pomoże!
źródło
Ten pracował dla mnie. Aby tylko komunikaty o błędach były wyświetlane jako
stdout
,log4j.properties
plik może wyglądać następująco:źródło
Jeśli nie masz możliwości edytowania kodu java w celu wstawienia
.setLogLevel()
instrukcji i nie chcesz wdrażać kolejnych plików zewnętrznych, możesz użyć metody brutalnej siły, aby rozwiązać ten problem. Po prostu odfiltruj wiersze INFO za pomocą grepa.źródło
Jeśli ktoś jeszcze w tym tkwi,
nic z powyższych nie działało dla mnie. Musiałem usunąć
z mojego build.gradle, aby dzienniki zniknęły. TLDR: Nie importuj żadnych innych struktur rejestrowania, powinno być dobrze po prostu używając
org.apache.log4j.Logger
źródło
Innym sposobem całkowitego zatrzymania dzienników jest:
To zadziałało dla mnie. NullAppender to
źródło