2016-05-10 4 views
0

Я собираюсь написать программу Hadoop 2.x MapReduce. Обычно журналы или любой вывод из Mapper или Reducer задания MapReduce регистрируются в журнале приложений YARN. Но меня больше всего интересует происходящее внутри Mapper. Итак, Я хотел бы использовать log4j2 внутри Mapper для входа в отдельный локальный файл на каждом узле данных.Как добавить регистратор в LogContext

Мой план состоит в том, чтобы инициализировать org.apache.logging.log4j.core.LoggerContext в начале Mapper, чтобы я мог перенастроить отдельный файл журнала, а затем инициализировать org.apache.logging.log4j.Logger. Проблема в том, что обе инициализированы успешно, но они не связаны друг с другом. Более того, только узел, вызывающий задание hadoop, инициализировал пустой файл журнала.

Мой вопрос:

  • Почему только узел вызова задания Hadoop инициализируется пустой файл журнала, другие узлы не хотя я уверен, что другие узлы также имеют картографами.
  • Как добавить регистратор в инициализированном журнале контексте

ответ

0

по умолчанию ContextSelector является ClassLoaderContextSelector, который создает LoggerContext на основе ClassLoader используется. Каждый вызов getLogger() проверяет, чтобы определить ClassLoader вызывающего объекта getLogger и использует LoggerContext, связанный с этими классами ClassLoader.

Если каждый Mapper имеет свой собственный ClassLoader, каждый из них будет иметь свой собственный LoggerContext. Но каждый LoggerContext должен иметь возможность находить свою конфигурацию и инициализировать ее. Если log4j2.xml не находится в пути к классам ClassLoader (или его родительского элемента), он будет использовать конфигурацию по умолчанию, которая, вероятно, не является тем, что вы хотите.

Я не написал Mapper и не очень хорошо знаком с этим, но, основываясь на вашем описании, я бы сказал, что то, что вы, вероятно, хотите сделать, это использовать класс Configurator для инициализации регистрации в каждом Mapper и передачи конфигурации вы хотите использовать. Обратите внимание, что вы не должны пытаться записывать конфигурации в одни и те же файлы. Вам придется либо использовать блокировку файлов, либо вы можете получить поврежденные файлы.

+0

Как я могу узнать, имеет ли Mapper свой собственный ClassLoader или нет? Тем не менее, я также хотел бы упомянуть, что класс Map Reduce является статическим классом, который я встроил в другой класс, а функция map находится внутри этого класса уменьшения статической карты. Пример: https://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html#Example:_WordCount_v2.0 – Rui

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