2

Я запускаю искровое задание в кластере google, и я пытаюсь получить некоторую информацию о регистрации во время процесса карты RDD. Быстрый пример:Получение выходных данных из искровых работников в облаке Google

object LoggerWrapper extends Serializable{ 
    @transient lazy val logger=Logger.getLogger("myLogger") 
} 
object Processing{ 
... 
    rdd.map(x=>{ 
     LoggerWrapper.logger.info("processing:"+x) 
     foo(x) 
    }) 
    ... 
    sparkContext.stop 
} 

Я следую методике описанной here в сочетании с направлениями нашли in the Spark webpage. Результат log4j.properties - тот, который показан в конце. Файл загружается с использованием флага --files команды gcloud (показано ниже). Я также обновил файл yarn-site.xml, так что для свойства yarn.log-aggregation-enable установлено значение true.

Мой первый вопрос заключается в том, что когда я бегу от главного узла yarn logs -application <applicationID>, я всегда получаю сообщение об ошибке «Агрегирование журнала не завершено или не включено». Есть ли что-то еще, что необходимо сделать для сбора сообщений.

Второй вопрос заключается в том, можно ли получать сообщения журнала всех работников на выходе консоли в процессе выполнения. Например, если искровое задание является потоковым заданием, тогда я хотел бы получить сообщения во время работы.

log4j.properties:

log4j.appender.myConsoleAppender=org.apache.log4j.ConsoleAppender 
log4j.appender.myConsoleAppender.layout=org.apache.log4j.PatternLayout 
log4j.appender.myConsoleAppender.layout.ConversionPattern=%d [%t] %-5p %c - %m%n 
log4j.appender.RollingAppender=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.RollingAppender.File=${spark.yarn.app.container.log.dir}/spark.log 
log4j.appender.RollingAppender.DatePattern='.'yyyy-MM-dd 
log4j.appender.RollingAppender.layout=org.apache.log4j.PatternLayout 
log4j.appender.RollingAppender.layout.ConversionPattern=[%p] %d %c %M - %m%n 

log4j.appender.RollingAppenderU=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.RollingAppenderU.File=${spark.yarn.app.container.log.dir}/sparkU.log 
log4j.appender.RollingAppenderU.DatePattern='.'yyyy-MM-dd 
log4j.appender.RollingAppenderU.layout=org.apache.log4j.PatternLayout 
log4j.appender.RollingAppenderU.layout.ConversionPattern=[%p] %d %c %M - %m%n 


# By default, everything goes to console and file 
log4j.rootLogger=INFO, RollingAppender, myConsoleAppender 

# My custom logging goes to another file 
log4j.logger.myLogger=INFO, RollingAppenderU, myConsoleAppender 

# The noisier spark logs go to file only 
log4j.logger.spark.storage=INFO, RollingAppender 
log4j.additivity.spark.storage=false 
log4j.logger.spark.scheduler=INFO, RollingAppender 
log4j.additivity.spark.scheduler=false 
log4j.logger.spark.CacheTracker=INFO, RollingAppender 
log4j.additivity.spark.CacheTracker=false 
log4j.logger.spark.CacheTrackerActor=INFO, RollingAppender 
log4j.additivity.spark.CacheTrackerActor=false 
log4j.logger.spark.MapOutputTrackerActor=INFO, RollingAppender 
log4j.additivity.spark.MapOutputTrackerActor=false 
log4j.logger.spark.MapOutputTracker=INFO, RollingAppender 
log4j.additivty.spark.MapOutputTracker=false 

команда gcloud: gcloud dataproc jobs submit spark --cluster myCluster --properties spark.driver.memory=1000m,spark.driver.maxResult=512m,spark.executor.memory=1000m --jars gs://path/to/jar/myJar.jar --files /absolute/path/to/local/file/log4j.properties --class contextual.wikidata.spark.jobs.$1 <application-arguments>

ответ

3

Как вы можете видеть в ContainerManagerImpl проверка на предмет того, включена агрегация журнал внутри кода nodemanager:

protected LogHandler createLogHandler(Configuration conf, Context context, 
    DeletionService deletionService) { 
    if (conf.getBoolean(YarnConfiguration.LOG_AGGREGATION_ENABLED, 
     YarnConfiguration.DEFAULT_LOG_AGGREGATION_ENABLED)) { 
    return new LogAggregationService(this.dispatcher, context, 
     deletionService, dirsHandler); 
    } else { 
    return new NonAggregatingLogHandler(this.dispatcher, deletionService, 
             dirsHandler, 
             context.getNMStateStore()); 
    } 
} 

И, кроме того, дополнительно выполняется как часть инициализации при создании LogHandler экземпляр в первый раз; это означает, что значение конфигурации должно быть предоставлено всем рабочим узлам и должно быть в конфигурации до запуска/перезапуска nodemanagers.

В Dataproc, вместо того, чтобы вручную изменяя yarn-site.xml файл самостоятельно, вы просто использовать гораздо проще --properties флаг при создании кластера, и ключ конфигурации будет правильно получить набор всех ваших узлов до служб демона запуска:

gcloud dataproc clusters create my-cluster \ 
    --properties yarn:yarn.log-aggregation-enable=true 

Кроме того, вы должны убедиться, что выполнение команды yarn logs как тот же пользователь, который бежал рабочие места или НИТИ будет пытаться заглянуть внутрь неправильно $USER каталога в каталоге агрегации журнала:

sudo yarn logs -applicationId <applicationId> 
+0

Большое спасибо за ответ! Возможно ли читать пользовательские журналы в потоковом задании, пока потоковая обработка все еще работает? – orestis

+1

На данный момент лучший способ сделать это, возможно, через [YARN UI] (https://cloud.google.com/dataproc/concepts/cluster-web-interfaces) и перейти к журналам контейнеров напрямую, нажав запустить приложение и найти ссылки на журналы контейнеров в левой части. Планируется дальнейшее совершенствование интеграции Stackdriver Dataproc в будущем, когда журналы контейнеров будут доступны через пользовательский интерфейс Cloud Logging, но пока нет конкретной даты. –

Смежные вопросы