จะปิดการบันทึกข้อมูลใน Spark ได้อย่างไร?


144

ฉันติดตั้ง Spark โดยใช้คู่มือ AWS EC2 และฉันสามารถเปิดใช้งานโปรแกรมได้อย่างดีโดยใช้bin/pysparkสคริปต์เพื่อไปที่จุดประกายประกายและยังสามารถทำ Quide Quick Start ได้สำเร็จ

อย่างไรก็ตามฉันไม่สามารถใช้ชีวิตของฉันหาวิธีหยุดการบันทึก verbose ทั้งหมด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

นี่คือ classpath แบบเต็มของฉันเมื่อฉันใช้SPARK_PRINT_LAUNCH_COMMAND:

คำสั่ง Spark: /Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/Home/bin/java -cp: /root/spark-1.0.1-bin-hadoop2/conf: /root/spark-1.0.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 spark-shell --class org.apache.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"

ในโปรแกรม Spark หลังจากสร้างเซสชันคุณสามารถตั้งค่าระดับการบันทึกตามที่กำหนดด้านล่างสำหรับ Java SparkSession spark = SparkSession.builder (). master ("local"). getOrCreate (); spark.sparkContext () setLogLevel ( "INFO.");
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

บันทึกและรีสตาร์ทเชลล์ของคุณ มันใช้งานได้สำหรับฉันสำหรับ Spark 1.1.0 และ Spark 1.5.1 บน OS X


1
สิ่งนี้ช่วยสำคัญที่ต้องตระหนักว่า log4j.properties ไม่มีอยู่เว้นแต่คุณจะสร้างมันขึ้นมา บน Ubuntu ฉันไม่ต้องรีสตาร์ทเพื่อให้การเปลี่ยนแปลงเหล่านี้มีผล
ก่อกวน

ไม่ได้ผลสำหรับฉัน Spark 1.5 RHEL 6. CDH 5.5 พยายามสร้างไฟล์ใหม่ /opt/cloudera/parcels/CDH/etc/spark/conf.dist/log4j.properties และเปลี่ยนแปลงตามที่อธิบายไว้ข้างต้น และลองแก้ไขไฟล์ที่มีอยู่ /etc/spark/conf/log4j.properties ไม่มีผลกับเชลล์ pyspark หรือสำหรับ pyspark-shell
Tagar

เราจำเป็นต้องทำสิ่งนี้กับทุกโหนดในกลุ่มประกายหรือไม่?
เมฆ

54

แรงบันดาลใจจาก pyspark / tests.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 )

การเรียกสิ่งนี้เพียงแค่สร้าง SparkContext จะลดจำนวนบรรทัด stderr ที่บันทึกไว้สำหรับการทดสอบของฉันจาก 2647 เป็น 163 อย่างไรก็ตามการสร้าง SparkContext นั้นจะบันทึกเอง 163 ขึ้นไป

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

และยังไม่ชัดเจนสำหรับฉันที่จะปรับโปรแกรมเหล่านั้น


2
หากคุณมีแนวคิดใด ๆ เกี่ยวกับวิธีปรับเปลี่ยนสายเหล่านั้นโปรดแบ่งปัน
Irene

ฉันคิดว่าไม่มีวิธีแก้ไขโดยตรงในการเปลี่ยนระดับการดีบักเริ่มต้นใน PySpark .. จนกระทั่ง SparkContext เริ่มทำงาน เนื่องจาก sc._jvm ถูกสร้างขึ้นหลังจาก SC ถูกสร้างขึ้น คุณยังคงสามารถเปลี่ยนแปลงได้ผ่านทางไฟล์ log4j.properies ตามที่อธิบายไว้ในคำตอบอื่น ๆ Spark ควรสร้างเช่นตัวแปร spark.default.logging ที่สามารถส่งไปยัง SparkConf เป็นตัวเลือกเพื่อแทนที่ระดับ Root Logger เริ่มต้น
Tagar

37

ใน Spark 2.0 คุณสามารถกำหนดค่าแบบไดนามิกสำหรับแอปพลิเคชันของคุณโดยใช้setLogLevel :

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

ในคอนโซลpysparksparkเซสชันเริ่มต้นจะพร้อมใช้งานแล้ว


คุณระงับข้อความบันทึกเท่านั้น แต่รหัสจริงกำลังทำงานในพื้นหลัง หากคุณเห็นการใช้งาน CPU จุดประกายการใช้ CPU จำนวนมากแม้ในขณะที่ไม่ได้ใช้งาน
hurelhuyag

นี่เป็นวิธีแก้ปัญหาสำหรับ PySpark ที่log4jไม่สามารถเข้าถึงได้
yeliabsalohcin

35

แก้ไขไฟล์ conf / log4j.properties ของคุณและเปลี่ยนบรรทัดต่อไปนี้:

   log4j.rootCategory=INFO, console

ถึง

    log4j.rootCategory=ERROR, console

อีกวิธีคือ:

Fireup spark-shell และพิมพ์ต่อไปนี้:

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

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

คุณจะไม่เห็นบันทึกใด ๆ หลังจากนั้น


3
ตัวเลือกในภายหลังใช้งานได้กับ spark-shell (scala) แต่คุณควรทำอย่างไรในกรณีของ pyspark โดยไม่เปลี่ยนไฟล์ log4j
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 และมันจะไป ...
2559

2
วิธีนี้จะระงับการบันทึกหลังจากที่เรียกใช้งาน แต่มีบันทึกข้อมูลจำนวนมากก่อนหน้านั้น
DavidJ

28

สำหรับ PySpark sc.setLogLevel("FATAL")คุณยังสามารถตั้งค่าระดับการบันทึกในสคริปต์ของคุณด้วย จากเอกสาร :

ควบคุม logLevel ของเรา สิ่งนี้จะแทนที่การตั้งค่าบันทึกที่ผู้ใช้กำหนด ระดับการบันทึกที่ถูกต้องประกอบด้วย: ALL, DEBUG, ERROR, FATAL, INFO, OFF, TRACE, WARN


ทางออกที่ยอดเยี่ยมที่ใช้งานได้กับ Spark รุ่นใหม่กว่า 1.4 (ตั้งแต่กลางปี ​​2015)
Jealie

ฉันลองสิ่งนี้ด้วย Spark 1.6.2 และ Scala และดูเหมือนว่ามันจะไม่ทำงาน
Yeikel

@Yeikel วิธีนี้สำหรับ PySpark ขออภัยที่ไม่ชัดเจน - ฉันจะแก้ไขคำตอบตอนนี้
Galen Long

15

คุณสามารถใช้ setLogLevel

val spark = SparkSession
      .builder()
      .config("spark.master", "local[1]")
      .appName("TestLog")
      .getOrCreate()

spark.sparkContext.setLogLevel("WARN")

14

อาจเกิดจากวิธีการคำนวณของ classpath ลางสังหรณ์ของฉันคือของ Hadooplog4j.propertiesไฟล์ปรากฏขึ้นก่อนหน้า Spark บนพา ธ คลาสเพื่อป้องกันไม่ให้การเปลี่ยนแปลงของคุณมีผล

ถ้าคุณวิ่ง

SPARK_PRINT_LAUNCH_COMMAND=1 bin/spark-shell

จากนั้น Spark จะพิมพ์คลาสพา ธ เต็มที่ใช้ในการเปิดตัวเชลล์ ในกรณีของฉันฉันเห็น

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อยู่ที่หัวของ classpath ที่

ฉันเปิดปัญหา [SPARK-2913]เพื่อแก้ไขปัญหานี้ในรุ่นถัดไป (ฉันควรจะได้รับการแก้ไขในไม่ช้า)

ในระหว่างนี้นี่เป็นวิธีแก้ไขปัญหาสองสามประการ:

  • เพิ่มไปexport SPARK_SUBMIT_CLASSPATH="$FWDIR/conf"spark-env.sh
  • ลบ /root/ephemeral-hdfs/conf/log4j.properties(หรือเปลี่ยนชื่อ)

ขอบคุณ. ฉันพยายามที่จะเพิ่มลงในไฟล์ spark-env.sh ของฉันและยังพยายามลบไฟล์ log4j.properties แต่ยังคงได้รับผลลัพธ์ INFO ฉันได้เพิ่ม classpath เต็มของฉันลงในคำถาม
horatio1701d

ขอบคุณสำหรับข้อมูลพิเศษ คุณสามารถโพสต์เนื้อหาของ spark-env.sh (คุณสามารถ redact ข้อมูลส่วนตัวเช่นชื่อโฮสต์) ได้ไหม
Josh Rosen

ขอบคุณ. โพสต์ spark-env.sh ขออภัยหากฉันเข้าใจผิดเกี่ยวกับวิธีการตั้งค่าพื้นฐาน ฉันเพิ่งปล่อยให้ทุกอย่างเป็นค่าเริ่มต้นเท่าที่จะทำได้ในตอนนี้เพื่อลองทดสอบ
horatio1701d

9

Spark 1.6.2:

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

จุดประกาย 2.x:

spark.sparkContext.setLogLevel('WARN')

(จุดประกายเป็น SparkSession)

หรือวิธีการเก่า

เปลี่ยนชื่อconf/log4j.properties.templateเป็นconf/log4j.propertiesใน Spark Dir

ใน log4j.propertiesเปลี่ยนlog4j.rootCategory=INFO, consoleเป็นlog4j.rootCategory=WARN, console

ระดับการบันทึกที่แตกต่างกัน:

  • ปิด (เฉพาะส่วนใหญ่ไม่มีการบันทึก)
  • FATAL (เฉพาะข้อมูลน้อยที่สุด)
  • ข้อผิดพลาด - เข้าสู่ระบบเฉพาะในกรณีที่มีข้อผิดพลาด
  • WARN - เข้าสู่ระบบเฉพาะในกรณีที่มีคำเตือนหรือข้อผิดพลาด
  • INFO (ค่าเริ่มต้น)
  • DEBUG - ขั้นตอนรายละเอียดบันทึก (และบันทึกทั้งหมดที่ระบุไว้ด้านบน)
  • TRACE (เจาะจงน้อยที่สุดมีข้อมูลจำนวนมาก)
  • ALL (เจาะจงน้อยที่สุดข้อมูลทั้งหมด)


5

ฉันใช้สิ่งนี้กับ Amazon EC2 กับ 1 นายและทาส 2 คนและ Spark 1.2.1

# 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

เพียงเพิ่มพารามิเตอร์ด้านล่างลงในคำสั่ง spark-submit ของคุณ

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

แทนที่ค่ากำหนดของระบบชั่วคราวสำหรับงานนั้นเท่านั้น ตรวจสอบชื่อคุณสมบัติที่แน่นอน (log4jspark.root.logger ที่นี่) จากไฟล์ log4j.properties

หวังว่านี่จะช่วยได้ไชโย!


อีกอย่างหนึ่งที่ฉันพบว่ามีประโยชน์คือคุณสามารถระบุไฟล์ log4j.properties:--conf spark.driver.extraJavaOptions='-Dlog4j.configuration=file:/home/foobar/log4j.properties
selle

2

ตัวอย่างโค้ดด้านล่างนี้สำหรับผู้ใช้งาน scala:

ตัวเลือกที่ 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 (ที่มีการติดตั้ง spark) หรือระดับโฟลเดอร์โครงการของคุณ 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 .
deepelement

0

ฉันต้องการใช้การบันทึกต่อไป (เครื่องมืออำนวยความสะดวกการบันทึกสำหรับ Python) คุณสามารถลองแยกการกำหนดค่าสำหรับแอปพลิเคชันของคุณและสำหรับ Spark:

LoggerManager()
logger = logging.getLogger(__name__)
loggerSpark = logging.getLogger('py4j')
loggerSpark.setLevel('WARNING')
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.