AWS EC2ガイドを使用してSparkをインストールし、bin/pyspark
スクリプトを使用してsparkプロンプトを表示してプログラムを正常に起動できます。また、クイックスタートの終了も正常に実行できます。
ただし、各コマンドの後に詳細なINFO
ロギングをすべて停止する方法を理解することはできません。
私は各ノードからだけでなく、アプリケーションを起動するconf
フォルダー内のlog4j.properties
ファイル内で、以下のコード(コメントアウト、OFFに設定)で可能なすべてのシナリオを試しましたが、何もしていません。各ステートメントの実行後に、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
を使用するときの完全なクラスパスは次のとおりです。
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ディレクトリで次のコマンドを実行します。
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
シェルを保存して再起動します。 OS XのSpark 1.1.0およびSpark 1.5.1で動作します。
私がした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に削減されました。
15/08/25 10:14:16 INFO SparkDeploySchedulerBackend: SchedulerBackend is ready for scheduling beginning after reached minRegisteredResourcesRatio: 0.0
プログラムでそれらを調整する方法がわかりません。
Conf/log4j.propertiesファイルを編集し、次の行を変更します。
log4j.rootCategory=INFO, console
に
log4j.rootCategory=ERROR, console
別のアプローチは次のとおりです。
Spark-Shellを起動し、次のように入力します。
import org.Apache.log4j.Logger
import org.Apache.log4j.Level
Logger.getLogger("org").setLevel(Level.OFF)
Logger.getLogger("akka").setLevel(Level.OFF)
その後、ログは表示されません。
>>> log4j = sc._jvm.org.Apache.log4j
>>> log4j.LogManager.getRootLogger().setLevel(log4j.Level.ERROR)
PySparkの場合、sc.setLogLevel("FATAL")
を使用してスクリプトのログレベルを設定することもできます。 docs から:
LogLevelを制御します。これにより、ユーザー定義のログ設定が上書きされます。有効なログレベルには、ALL、DEBUG、ERROR、FATAL、INFO、OFF、TRACE、WARNが含まれます。
Spark 2.0では、 setLogLevel を使用して、アプリケーション用に動的に構成することもできます。
from pyspark.sql import SparkSession
spark = SparkSession.builder.\
master('local').\
appName('foo').\
getOrCreate()
spark.sparkContext.setLogLevel('WARN')
pysparkコンソールでは、デフォルトのspark
セッションがすでに利用可能です。
これは、Sparkがクラスパスを計算する方法に起因する可能性があります。私の考えでは、Hadoopのlog4j.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
はクラスパスの先頭にあります。
問題[SPARK-2913] を開いて、次のリリースでこれを修正しました(すぐにパッチをリリースする必要があります)。
それまでの間、いくつかの回避策があります。
export SPARK_SUBMIT_CLASSPATH="$FWDIR/conf"
をspark-env.sh
に追加します。/root/ephemeral-hdfs/conf/log4j.properties
を削除(または名前変更)します。SetLogLevelを使用できます
val spark = SparkSession
.builder()
.config("spark.master", "local[1]")
.appName("TestLog")
.getOrCreate()
spark.sparkContext.setLogLevel("WARN")
Spark 1.6.2:
log4j = sc._jvm.org.Apache.log4j
log4j.LogManager.getRootLogger().setLevel(log4j.Level.ERROR)
Spark 2.x:
spark.sparkContext.setLogLevel('WARN')
(SparkSessionであるスパーク)
あるいは、古い方法、
Spark Dirでconf/log4j.properties.template
をconf/log4j.properties
に名前変更します。
log4j.properties
で、log4j.rootCategory=INFO, console
をlog4j.rootCategory=WARN, console
に変更します
利用可能なさまざまなログレベル:
これを、1つのマスターと2つのスレーブとSpark 1.2.1のAmazon EC2で使用しました。
# 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/
私のやり方は次のとおりです。
spark-submit
スクリプトを実行する場所で
$ cp /etc/spark/conf/log4j.properties .
$ nano log4j.properties
INFO
を任意のレベルのロギングに変更し、spark-submit
を実行します
以下のパラメータをspark-submitコマンドに追加するだけです
--conf "spark.driver.extraJavaOptions=-Dlog4jspark.root.logger=WARN,console"
これは、そのジョブに対してのみ一時的にシステム値をオーバーライドします。 log4j.propertiesファイルから正確なプロパティ名(ここではlog4jspark.root.logger)を確認します。
これがお役に立てば幸いです!
以下のscalaユーザーのコードスニペット:
オプション1:
スニペットの下に、ファイルレベルで追加できます
import org.Apache.log4j.{Level, Logger}
Logger.getLogger("org").setLevel(Level.WARN)
オプション2:
注:sparkセッションを使用しているすべてのアプリケーションに適用されます。
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
私見、オプション1はファイルレベルでオフにできるので賢明です。
プログラム的な方法
spark.sparkContext.setLogLevel("WARN")
利用可能なオプション
ERROR
WARN
INFO
ロギング(Pythonのロギング機能)を使い続けたいので、アプリケーションとSparkの設定を分割してみてください:
LoggerManager()
logger = logging.getLogger(__name__)
loggerSpark = logging.getLogger('py4j')
loggerSpark.setLevel('WARNING')