Làm cách nào để tắt đăng nhập INFO trong Spark?


144

Tôi đã cài đặt Spark bằng hướng dẫn AWS EC2 và tôi có thể khởi chạy chương trình tốt bằng cách sử dụng bin/pysparktập lệnh để đến dấu nhắc tia lửa và cũng có thể thực hiện thành công nhanh chóng bắt đầu.

Tuy nhiên, tôi không thể tìm ra cách ngăn chặn tất cả các bản INFOghi dài dòng sau mỗi lệnh.

Tôi đã thử gần như mọi kịch bản có thể có trong đoạn mã dưới đây (bình luận, cài đặt thành TẮT) trong log4j.propertiestệp của mình trong confthư mục nơi tôi khởi chạy ứng dụng cũng như trên mỗi nút và không làm gì cả. Tôi vẫn nhận được INFOin báo cáo đăng nhập sau khi thực hiện mỗi tuyên bố.

Tôi rất bối rối với cách làm việc này.

#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

Đây là classpath đầy đủ của tôi khi tôi sử dụng SPARK_PRINT_LAUNCH_COMMAND:

Lệnh Spark: / L Library / Java / JavaVirtualMachines / jdk1.8.0_05.jdk / Content / Home / bin / java -cp: /root/spark-1.0.1-bin-hadoop2/conf: /root/spark-1.0 -bin-hadoop2 / conf: /root/spark-1.0.1-bin-hadoop2/lib/spark-assinstall-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.l Library.path = -Xms512m -Xmx512m org.apache.spark.deploy.SparkSubmit spark-shell thay thế

nội dung của 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"

Trong chương trình Spark sau khi tạo phiên, bạn có thể đặt mức Nhật ký như được đưa ra dưới đây cho Java SparkSession spark = SparkSession.builder (). Master ("local"). GetOrCreate (); spark.sparkContext (). setLogLevel ("INFO");
iKing

Câu trả lời:


158

Chỉ cần thực hiện lệnh này trong thư mục spark:

cp conf/log4j.properties.template conf/log4j.properties

Chỉnh sửa log4j.properies:

# 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

Thay thế ở dòng đầu tiên:

log4j.rootCategory=INFO, console

bởi:

log4j.rootCategory=WARN, console

Lưu và khởi động lại vỏ của bạn. Nó hoạt động với tôi cho Spark 1.1.0 và Spark 1.5.1 trên OS X.


1
Điều này giúp, rất quan trọng để nhận ra rằng log4j.properies không tồn tại trừ khi bạn tạo nó. Trên Ubuntu, tôi không cần phải khởi động lại để những thay đổi này ảnh hưởng.
gây rối

Không làm việc cho tôi. Tia lửa 1,5. RĂNG 6. CDH 5.5. Đã thử tạo tệp mới /opt/cloudera/parcels/CDH/etc/spark/conf.dist/log4j.properies và thay đổi như đã giải thích ở trên. Và cũng đã thử chỉnh sửa tập tin hiện có /etc/spark/conf/log4j.properies. Không ảnh hưởng đến vỏ pyspark cũng như vỏ pyspark.
Tagar

chúng ta có cần phải làm điều này cho tất cả các nút trong cụm tia lửa không?
đám mây

54

Lấy cảm hứng từ pyspark / tests.py tôi đã làm

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 )

Gọi điều này ngay sau khi tạo SparkContext đã giảm các dòng stderr được ghi lại cho thử nghiệm của tôi từ 2647 xuống còn 163. Tuy nhiên, việc tạo SparkContext tự ghi nhật ký 163, tối đa

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

và tôi không rõ cách điều chỉnh chúng theo chương trình.


2
nếu bạn có bất kỳ ý tưởng nào về cách điều chỉnh các dòng đó, vui lòng chia sẻ
Irene

Tôi nghĩ rằng không có giải pháp trực tiếp nào để thay đổi mức độ gỡ lỗi mặc định trong PySpark .. cho đến khi SparkContext bắt đầu. Bởi vì sc._jvm chỉ được tạo sau khi SC được tạo. Bạn vẫn có thể thay đổi thông qua tệp log4j.properies mặc dù như được thảo luận trong các câu trả lời khác. Spark nên tạo ví dụ biến Spark.default.logging có thể được truyền cho SparkConf như một tùy chọn để ghi đè mức Root Logger mặc định.
Tagar

37

Trong Spark 2.0, bạn cũng có thể định cấu hình động cho ứng dụng của mình bằng setLogLevel :

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

Trong bảng điều khiển pyspark , một sparkphiên mặc định sẽ có sẵn.


Bạn chỉ cần loại bỏ thông điệp tường trình. Nhưng mã thực tế đang chạy trong nền. Nếu bạn thấy việc sử dụng CPU. Spark sử dụng nhiều CPU ngay cả khi không sử dụng.
Hurelhuyag

Đây chính xác là giải pháp cho PySpark hoạt động ở nơi log4jkhông thể truy cập.
yeliabsalohcin

35

Chỉnh sửa tệp conf / log4j.properIES của bạn và Thay đổi dòng sau:

   log4j.rootCategory=INFO, console

đến

    log4j.rootCategory=ERROR, console

Một cách tiếp cận khác là:

Fireup shell-shell và gõ như sau:

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

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

Bạn sẽ không thấy bất kỳ nhật ký nào sau đó.


3
tùy chọn sau hoạt động cho spark-shell (scala) nhưng bạn nên làm gì trong trường hợp pyspark mà không thay đổi tệp log4j?
hmi2015

Thay đổi tệp thuộc tính log4j thành "cảnh báo" sẽ tốt hơn, nhưng nếu không, câu trả lời này của wannik không có tác dụng thay đổi cấp độ nhật ký thành bàn điều khiển cho pyspark stackoverflow.com/a
michael

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

Tôi đã sử dụng điều này cho pyspark. Hoạt động tuyệt vời như một hack một lót. Tôi vẫn nhận được các tin nhắn đã chết của SợiExecutor, đó không phải là một lỗi, imho. Và như vậy nó đi ...
jatal

2
Điều này ngăn chặn việc ghi nhật ký sau khi nó thực thi, nhưng có rất nhiều nhật ký INFO trước thời điểm đó, thật không may.
DavidJ

28

Đối với PySpark, bạn cũng có thể đặt cấp độ nhật ký trong tập lệnh của mình sc.setLogLevel("FATAL"). Từ các tài liệu :

Kiểm soát logLevel của chúng tôi. Điều này ghi đè bất kỳ cài đặt nhật ký do người dùng xác định. Các mức nhật ký hợp lệ bao gồm: ALL, DEBUG, ERROR, FATAL, INFO, OFF, TRACE, WARN


Giải pháp tuyệt vời hoạt động cho các phiên bản Spark mới hơn 1.4 (vì vậy, kể từ giữa năm 2015).
Jealie

Tôi đã thử điều này với Spark 1.6.2 và Scala và nó dường như không hoạt động
Yeikel

@Yeikel Giải pháp này dành cho PySpark. Xin lỗi điều đó không được làm rõ - Tôi sẽ chỉnh sửa câu trả lời ngay bây giờ.
Galen Long

15

Bạn có thể sử dụng setLogLevel

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

spark.sparkContext.setLogLevel("WARN")

14

Điều này có thể là do Spark tính toán đường dẫn của nó. Linh cảm của tôi là log4j.propertiestệp của Hadoop xuất hiện trước Spark trên đường dẫn lớp, ngăn các thay đổi của bạn có hiệu lực.

Nếu bạn chạy

SPARK_PRINT_LAUNCH_COMMAND=1 bin/spark-shell

sau đó Spark sẽ in đường dẫn đầy đủ được sử dụng để khởi chạy shell; trong trường hợp của tôi, tôi thấy

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

ở đâu /root/ephemeral-hdfs/conflà ở đầu của classpath.

Tôi đã mở một sự cố [SPARK-2913] để khắc phục sự cố này trong phiên bản tiếp theo (tôi sẽ sớm có bản vá).

Trong thời gian này, đây là một vài cách giải quyết:

  • Thêm export SPARK_SUBMIT_CLASSPATH="$FWDIR/conf"vào spark-env.sh.
  • Xóa (hoặc đổi tên) /root/ephemeral-hdfs/conf/log4j.properties.

Cảm ơn bạn. Tôi đã cố gắng thêm nó vào tệp spark-env.sh của mình và cũng đã cố xóa tệp log4j.properIES nhưng vẫn nhận được đầu ra INFO. Tôi đã thêm đầy đủ classpath của tôi vào câu hỏi.
horatio1701d

Cám ơn vì thông tin thêm. Bạn cũng có thể đăng nội dung của spark-env.sh (bạn có thể sắp xếp lại thông tin cá nhân, như tên máy chủ) không?
Josh Rosen

cảm ơn bạn. đăng Spark-env.sh. Xin lỗi nếu tôi hiểu sai về cách thiết lập cơ sở. Tôi chỉ để mọi thứ mặc định nhất có thể bây giờ chỉ để thử một số thử nghiệm.
horatio1701d

9

Tia lửa 1.6.2:

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

Tia lửa 2.x:

spark.sparkContext.setLogLevel('WARN')

(Spark là SparkSession)

Hoặc các phương pháp cũ,

Đổi tên conf/log4j.properties.templatethành conf/log4j.propertiesSpark Dir.

Trong log4j.properties, thay đổi log4j.rootCategory=INFO, consolethànhlog4j.rootCategory=WARN, console

Các cấp độ nhật ký khác nhau có sẵn:

  • TẮT (cụ thể nhất, không đăng nhập)
  • FATAL (cụ thể nhất, ít dữ liệu)
  • LRI - Chỉ đăng nhập trong trường hợp có lỗi
  • WARN - Chỉ đăng nhập trong trường hợp Cảnh báo hoặc Lỗi
  • THÔNG TIN (Mặc định)
  • DEBUG - Nhật ký chi tiết các bước (và tất cả các nhật ký đã nêu ở trên)
  • TRACE (ít cụ thể nhất, rất nhiều dữ liệu)
  • TẤT CẢ (ít cụ thể nhất, tất cả dữ liệu)

8

Cách lập trình

spark.sparkContext.setLogLevel("WARN")

Tùy chọn có sẵn

ERROR
WARN 
INFO 

5

Tôi đã sử dụng điều này với Amazon EC2 với 1 chủ và 2 nô lệ và 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

Chỉ cần thêm param dưới đây vào lệnh spark-submit của bạn

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

Điều này ghi đè giá trị hệ thống tạm thời chỉ cho công việc đó. Kiểm tra tên thuộc tính chính xác (log4jspark.root.logger tại đây) từ tệp log4j.properIES.

Hy vọng điều này sẽ giúp, chúc mừng!


Một cái khác tôi thấy hữu ích là bạn có thể chỉ định tệp log4j.properIES:--conf spark.driver.extraJavaOptions='-Dlog4j.configuration=file:/home/foobar/log4j.properties
selle

2

Đoạn mã dưới đây cho người dùng scala:

Lựa chọn 1 :

Bên dưới đoạn bạn có thể thêm ở cấp độ tệp

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

Lựa chọn 2 :

Lưu ý: sẽ được áp dụng cho tất cả các ứng dụng đang sử dụng phiên Spark.

import org.apache.spark.sql.SparkSession

  private[this] implicit val spark = SparkSession.builder().master("local[*]").getOrCreate()

spark.sparkContext.setLogLevel("WARN")

Tùy chọn 3:

Lưu ý: Cấu hình này phải được thêm vào log4j.properies của bạn .. (có thể giống như /etc/spark/conf/log4j.properies (nơi có cài đặt tia lửa) hoặc cấp độ thư mục dự án của bạn log4j.properies) vì bạn đang thay đổi tại cấp độ mô-đun. Điều này sẽ được áp dụng cho tất cả các ứng dụng.

log4j.rootCategory=ERROR, console

IMHO, Tùy chọn 1 là cách khôn ngoan vì nó có thể được tắt ở cấp độ tệp.


1

Cách tôi làm là:

ở vị trí tôi chạy spark-submitscript

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

thay đổi INFOmức độ đăng nhập bạn muốn và sau đó chạyspark-submit


cp /etc/spark/conf/log4j.properties.template .
đào sâu

0

Tôi muốn tiếp tục sử dụng tính năng ghi nhật ký (Cơ sở ghi nhật ký cho Python), bạn có thể thử chia nhỏ cấu hình cho ứng dụng của mình và cho Spark:

LoggerManager()
logger = logging.getLogger(__name__)
loggerSpark = logging.getLogger('py4j')
loggerSpark.setLevel('WARNING')
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.