Apache запускает Stderr и стандартный вывод

#apache-spark

#apache-spark

Вопрос:

Я запускаю spark-1.0.0, подключаясь к автономному кластеру spark, в котором есть один ведущий и два ведомых устройства. Я запустил wordcount.py с помощью Spark-submit фактически считывает данные из HDFS, а также записывает результаты в HDFS. Пока все в порядке, и результаты будут корректно записаны в HDFS. Но меня беспокоит то, что когда я проверяю стандартный вывод для каждого рабочего, он пуст, я не знаю, предполагается ли, что он пустой? и я получил следующее в stderr:

страница журнала stderr для некоторых (приложение-20140704174955-0002)

 Spark 
Executor Command: "java" "-cp" "::
/usr/local/spark-1.0.0/conf:
/usr/local/spark-1.0.0
/assembly/target/scala-2.10/spark-assembly-1.0.0-hadoop1.2.1.jar:/usr/local/hadoop/conf" "
-XX:MaxPermSize=128m" "-Xms512M" "-Xmx512M" "org.apache.spark.executor.CoarseGrainedExecutorBackend
" "akka.tcp://spark@master:54477/user/CoarseGrainedScheduler" "0" "slave2" "1
" "akka.tcp://sparkWorker@slave2:41483/user/Worker" "app-20140704174955-0002"
========================================


14/07/04 17:50:14 ERROR CoarseGrainedExecutorBackend: 
Driver Disassociated [akka.tcp://sparkExecutor@slave2:33758] -> 
[akka.tcp://spark@master:54477] disassociated! Shutting down.
  

Комментарии:

1. Это нормально. Ваша программа-драйвер выполнила свою работу (количество слов) и отключилась.

2. Что насчет Stdout, он пустой, имеет ли это смысл?

Ответ №1:

Spark всегда записывает все, даже ИНФОРМАЦИЮ в stderr. Люди, похоже, делают это, чтобы остановить буферизацию сообщений stdout и вызвать менее предсказуемое ведение журнала. Это приемлемая практика, когда известно, что приложение никогда не будет использоваться в сценариях bash, поэтому особенно распространена для ведения журнала.

Комментарии:

1. Спасибо за ответ — у меня есть еще один вопрос, касающийся reduceByKey. На самом деле, я хочу знать, сколько подчиненных узлов будет задействовано при использовании этого метода? будет ли это зависеть от количества редукторов, которые мы задаем в качестве аргумента reduce tasks?

2. Все узлы будут использоваться при условии, что у вас больше разделов, чем у вас всего ядер. Рекомендуется иметь как минимум 2-4 раздела на ядро. Если ваши данные уже разделены на подходящее число, нет необходимости передавать этот параметр в метод reduceByKey.

3. @samthebest — вы хотите сказать, что все выходные данные Spark отправляются в stderr? Я выполнил простую «print ()» внутри моей функции spark map, и когда я просматриваю файлы журнала с моего подчиненного компьютера в разделе work / app-<APPNUMBER> / 0 /, я вижу распечатки в stderr, но не в stdout. мой стандартный вывод пуст. я нахожу это странным — какой смысл иметь стандартный вывод, если он всегда пуст?

4. @samthebest — есть ли способ ограничить размер stderr или истечь срок действия предыдущих сообщений? У меня есть структурированное потоковое задание, и stderr заполняется

Ответ №2:

Попробуйте это в log4j.properties, переданном в Spark (или измените конфигурацию по умолчанию в Spark / conf)

 # Log to stdout and stderr
log4j.rootLogger=INFO, stdout, stderr

# Send TRACE - INFO level to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Threshold=TRACE
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.filter.filter1=org.apache.log4j.varia.LevelRangeFilter
log4j.appender.stdout.filter.filter1.levelMin=TRACE
log4j.appender.stdout.filter.filter1.levelMax=INFO
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

# Send WARN or higher to stderr
log4j.appender.stderr=org.apache.log4j.ConsoleAppender
log4j.appender.stderr.Threshold=WARN
log4j.appender.stderr.Target  =System.err
log4j.appender.stderr.layout=org.apache.log4j.PatternLayout
log4j.appender.stderr.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

# Change this to set Spark log level
log4j.logger.org.apache.spark=WARN
log4j.logger.org.apache.spark.util=ERROR
  

Кроме того, в stderr отправляются индикаторы выполнения, показанные на информационном уровне.

Отключить с помощью

 spark.ui.showConsoleProgress=false