स्पार्क में INFO लॉगिंग कैसे बंद करें?


144

मैंने AWS EC2 गाइड का उपयोग करके स्पार्क स्थापित किया और मैं bin/pysparkस्पार्क प्रॉम्प्ट को प्राप्त करने के लिए स्क्रिप्ट का उपयोग करके प्रोग्राम को ठीक से लॉन्च कर सकता हूं और क्विक स्टार्ट क्वाइड को सफलतापूर्वक भी कर सकता हूं।

हालाँकि, मैं अपने जीवन के लिए यह पता नहीं लगा सकता कि INFOप्रत्येक कमांड के बाद सभी वर्बोज़ लॉगिंग को कैसे रोका जाए ।

मैंने नीचे दिए गए कोड में लगभग हर संभावित परिदृश्य की कोशिश की है (बाहर टिप्पणी करना, बंद करना) फ़ोल्डर में अपनी log4j.propertiesफ़ाइल के भीतर 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:

स्पार्क कमांड: /Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/Home/bin/java -cp: /root/spark-1.1-bin-hadoop2/conf: /root/spark-1.0.1.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 स्पार्क-शेल --class org.apache.spark.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"

स्पार्क कार्यक्रम में सत्र बनाने के बाद आप Java SparkSession spark = SparkSession.derder () के लिए नीचे दिए गए लॉग स्तर को सेट कर सकते हैं। मास्टर ("स्थानीय")। getOrCreate (); spark.sparkContext () setLogLevel ( "जानकारी")।
iKing

जवाबों:


158

स्पार्क निर्देशिका में इस कमांड को निष्पादित करें:

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

सहेजें और अपने शेल को पुनरारंभ करें। यह मेरे लिए स्पार्क 1.1.0 और ओएस एक्स पर स्पार्क 1.5.1 के लिए काम करता है।


1
जब तक आप इसे नहीं बनाते, तब तक यह महसूस करना महत्वपूर्ण है कि log4j.properties मौजूद नहीं है। Ubuntu पर, मुझे इन परिवर्तनों को प्रभावित करने के लिए पुनः आरंभ करने की आवश्यकता नहीं थी।
विघटनकारी

मेरे लिए काम नहीं किया। स्पार्क 1.5। आरएचईएल 6. सीडीएच 5.5। नई फ़ाइल बनाने की कोशिश की गई है / ऊपर / क्लोउडर / अपरसेल /सीडीएच /etc/spark/conf.dist/log4j.properties और ऊपर बताए अनुसार बदल रहा है। और मौजूदा फ़ाइल /etc/spark/conf/log4j.properties को संपादित करने का भी प्रयास किया। Pyspark खोल के लिए कोई प्रभाव नहीं और न ही pyspark- शेल के लिए।
तगार

क्या हमें स्पार्क क्लस्टर में सभी नोड्स के लिए ऐसा करने की आवश्यकता है?
मेघ

54

Pyspark / test.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 )

2647 से 163 तक मेरे परीक्षण के लिए स्‍पार्ककॉन्‍टेक्‍ट कम स्‍ट्रेडर लाइन्‍स बनाने के ठीक बाद यह कॉल करना। हालांकि स्‍पार्ककॉन्‍टेक्‍ट का निर्माण स्‍वयं 163, अप तक लॉग करता है।

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

और यह मेरे लिए स्पष्ट नहीं है कि कैसे उन प्रोग्राम को समायोजित किया जाए।


2
यदि आपके पास उन पंक्तियों को समायोजित करने के तरीके के बारे में कोई विचार है, तो कृपया साझा करें
Irene

मुझे लगता है कि पाइस्पार्क में डिफ़ॉल्ट डिबगिंग स्तर को बदलने के लिए कोई प्रत्यक्ष समाधान नहीं है .. जब तक कि स्पार्ककॉन्टेक्ट शुरू नहीं होता है। क्योंकि SC के बनने के बाद ही sc._jvm बनाया जाता है। आप अभी भी बदल सकते हैं कि log4j.properies फ़ाइल के माध्यम से हालांकि अन्य उत्तरों में चर्चा की गई है। स्पार्क को उदाहरण के लिए स्पार्क बनाना चाहिए ।default.log वैरिएबल जो डिफॉल्ट रूट लॉगर स्तर को ओवरराइड करने के विकल्प के रूप में स्पार्ककॉनफ को दिया जा सकता है।
तगार

37

स्पार्क 2.0 में आप सेटलॉगवेल का उपयोग करके अपने एप्लिकेशन के लिए इसे गतिशील रूप से कॉन्फ़िगर कर सकते हैं :

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

में pyspark कंसोल, एक डिफ़ॉल्ट sparkसत्र पहले से ही उपलब्ध हो जाएगा।


आपने बस लॉग संदेशों को दबा दिया है। लेकिन वास्तविक कोड पृष्ठभूमि में चल रहा है। यदि आप CPU उपयोग देखते हैं। निष्क्रिय होने पर भी बहुत से CPU का उपयोग करना।
hurelhuyag

यह वास्तव में PySpark कार्य के लिए समाधान था जहां log4jपहुंच योग्य नहीं है।
येलियाब्लासोहिन

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
बाद का विकल्प स्पार्क-शेल (स्केला) के लिए काम करता है, लेकिन लॉग 4j फ़ाइल को बदले बिना आपको pyspark के मामले में क्या करना चाहिए?
hmi2015

Log4j गुण फ़ाइल को "चेतावनी" में बदलना बेहतर होगा, लेकिन अन्यथा wannik का यह जवाब pyspark stackoverflow.com/a/34487962/127971 के
michael

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

मैंने इसका इस्तेमाल pyspark के लिए किया है। एक लाइनर हैक के रूप में महान काम करता है। मुझे अभी भी मूर्खतापूर्ण YarnExecutor मर गए संदेश मिलते हैं, जो एक त्रुटि नहीं होनी चाहिए, imho। और इसलिए यह जाता है ...
jatal

2
यह क्रियान्वित होने के बाद लॉगिंग को दबा देता है, लेकिन दुर्भाग्य से उस बिंदु से पहले बहुत सारी जानकारी लॉग होती है।
डेविड जेएन

28

PySpark के लिए, आप अपनी स्क्रिप्ट में लॉग स्तर भी सेट कर सकते हैं sc.setLogLevel("FATAL")। से डॉक्स :

हमारे logLevel को नियंत्रित करें। यह किसी भी उपयोगकर्ता-निर्धारित लॉग सेटिंग्स को ओवरराइड करता है। मान्य लॉग स्तरों में शामिल हैं: ALL, DEBUG, ERROR, FATAL, INFO, OFF, TRACE, WARN


महान समाधान जो स्पार्क के संस्करणों के लिए 1.4 से अधिक काम करता है (इसलिए, 2015 के मध्य से)।
जेले

मैंने स्पार्क 1.6.2 और स्काला के साथ यह कोशिश की और यह काम नहीं लगता है
येइकेल

@ वायकेल यह समाधान पाइस्पार्क के लिए है। खेद है कि स्पष्ट नहीं किया गया था - अब मैं जवाब संपादित करूँगा।
गेलन लॉन्ग


14

यह स्पार्क द्वारा अपने वर्गपथ की गणना करने के कारण हो सकता है। मेरा कूबड़ यह है कि हैडोप की log4j.propertiesफाइल क्लासपाथ पर स्पार्क के आगे दिखाई दे रही है, जिससे आपके परिवर्तन प्रभावी हो रहे हैं।

अगर तुम दौड़ते हो

SPARK_PRINT_LAUNCH_COMMAND=1 bin/spark-shell

तब स्पार्क शेल को लॉन्च करने के लिए उपयोग किए जाने वाले पूर्ण क्लासपाथ को प्रिंट करेगा; मेरे मामले में, मैं देख रहा हूँ

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] खोला है (मुझे जल्द ही एक पैच आउट होना चाहिए)।

इस बीच, यहाँ कुछ कामगार हैं:

  • जोड़े export SPARK_SUBMIT_CLASSPATH="$FWDIR/conf"को spark-env.sh
  • हटाएं (या नाम बदलें) /root/ephemeral-hdfs/conf/log4j.properties

धन्यवाद। मैंने अपनी स्पार्क-env.sh फ़ाइल में उसे जोड़ने की कोशिश की और log4j.properties फ़ाइल को हटाने की भी कोशिश की लेकिन अभी भी जानकारी प्राप्त कर रहा है। मैंने सवाल करने के लिए अपना पूरा क्लासपैथ जोड़ा है।
Horatio1701d

अतिरिक्त जानकारी के लिए धन्यवाद। क्या आप स्पार्क-env.sh की सामग्री भी पोस्ट कर सकते हैं (आप होस्टनाम की तरह निजी जानकारी को पुनः प्राप्त कर सकते हैं)?
जोश रोसेन

धन्यवाद। पोस्ट की गई स्पार्क-env.sh क्षमा करें यदि मैं गलत समझ रहा हूं कि आधार सेटअप कैसे हो रहा है। मैंने अभी कुछ तय करने की कोशिश करने के लिए बस के रूप में संभव के रूप में डिफ़ॉल्ट के रूप में सब कुछ छोड़ दिया।
horatio1701d 20

9

स्पार्क 1.6.2:

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

चिंगारी 2.x:

spark.sparkContext.setLogLevel('WARN')

(चिंगारी होने की चिंगारी)

वैकल्पिक रूप से पुराने तरीके,

नाम बदलें conf/log4j.properties.templateकरने के लिए conf/log4j.propertiesस्पार्क डिर में।

में log4j.propertiesबदल log4j.rootCategory=INFO, consoleजाते हैंlog4j.rootCategory=WARN, console

विभिन्न लॉग स्तर उपलब्ध हैं:

  • बंद (सबसे विशिष्ट, कोई लॉगिंग नहीं)
  • FATAL (सबसे विशिष्ट, थोड़ा डेटा)
  • त्रुटि - त्रुटियों की स्थिति में ही प्रवेश करें
  • चेतावनी - चेतावनी या त्रुटियों के मामले में ही लॉग इन करें
  • जानकारी (डिफ़ॉल्ट)
  • DEBUG - लॉग विवरण चरण (और उपरोक्त सभी लॉग)
  • TRACE (कम से कम विशिष्ट, बहुत सारा डेटा)
  • सभी (कम से कम विशिष्ट, सभी डेटा)


5

मैंने 1 मास्टर और 2 दास और स्पार्क 1.2.1 के साथ अमेज़ॅन ईसी 2 के साथ इसका इस्तेमाल किया।

# 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

बस अपने स्पार्क-सबमिट कमांड के नीचे परम जोड़ें

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

यह केवल उस कार्य के लिए अस्थायी रूप से सिस्टम मान को ओवरराइड करता है। लॉग 4j.properties फ़ाइल से सटीक संपत्ति नाम (log4jspark.root.logger यहाँ) की जाँच करें।

आशा है कि यह मदद करता है, चीयर्स!


: एक और एक मैं उपयोगी पाया है कि आप log4j.properties फ़ाइल निर्दिष्ट कर सकते हैं--conf spark.driver.extraJavaOptions='-Dlog4j.configuration=file:/home/foobar/log4j.properties
selle

2

यह स्लैला उपयोगकर्ताओं के लिए कोड स्निपेट है:

विकल्प 1 :

स्निपेट के नीचे आप फ़ाइल स्तर पर जोड़ सकते हैं

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

विकल्प 2 :

नोट: जो सभी एप्लिकेशन के लिए लागू होगा जो स्पार्क सत्र का उपयोग कर रहा है।

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 (जहां स्पार्क इंस्टॉलेशन हो)) या आपके प्रोजेक्ट फ़ोल्डर स्तर log4j.properties (जैसे आप बदल रहे हैं) मॉड्यूल स्तर। यह सभी आवेदन के लिए लागू होगा।

log4j.rootCategory=ERROR, console

IMHO, विकल्प 1 बुद्धिमान तरीका है क्योंकि इसे फ़ाइल स्तर पर बंद किया जा सकता है।


1

जिस तरह से मैं यह कर रहा हूँ:

जिस स्थान पर मैं spark-submitस्क्रिप्ट चलाता हूं

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

INFOआप क्या चाहते हैं लॉगिंग के कभी भी स्तर में परिवर्तन और फिर अपने चलाएंspark-submit


cp /etc/spark/conf/log4j.properties.template .
दीपावली

0

मैं आपको लॉगिंग (पायथन के लिए लॉगिंग सुविधा) का उपयोग करते रहना चाहता हूं, आप अपने आवेदन के लिए और स्पार्क के लिए विभाजन को आजमा सकते हैं:

LoggerManager()
logger = logging.getLogger(__name__)
loggerSpark = logging.getLogger('py4j')
loggerSpark.setLevel('WARNING')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.