2013-11-30 4 views
0

Я новичок в Hadoop & MapReduce. Мы разрабатываем инструмент сетевого мониторинга (в java). Мы собираем различную информацию о контролируемых устройствах периодически, скажем, каждые 5 секунд. и написать эту информацию HDFS через Java клиента каждую информацию в качестве нового файла (с we'r не использует HDFS добавить объект) .В HDFS наша организация данных будет выглядеть так:Объединение большого количества небольших файлов для ввода mapreduce

/monitored_info 
     /f1.txt 
     /f2.txt 
     ....... 
     /f1020010.txt 

Таким образом, каждый файл, как правило, меньше, чем 2KB в размере. Я знаю, что каждая задача карты может занимать до 1 файла, и она будет появляться так же, как и задание карты, и задание будет неэффективным. Чтобы избавиться от этого, мы использовали объект слияния FileUtil, прежде чем приступить к работе:

FileUtil.copyMerge(fileSystem, new Path("monitored_info"), fileSystem, 
       new Path("mapInputfile"), false, conf, null);

Это хорошая практика? Или существует ли какой-либо другой механизм, используемый для таких требований? Пожалуйста, помогите ...

+0

не удалось объединить мелкие файлы перед входом в hadoop? Если вам не нужна немедленная обработка данных, это кажется более разумным ... – xhudik

+0

Можем ли мы использовать функции добавления? Я использовал hadoop-1.0.4, и он не поддерживает это. –

+0

хорошо, Куст может добавить (не уверен в Hbase). Мое предложение состояло в том, что если вам не нужны данные процесса сразу (например, один раз в 6 часов в порядке), я бы поместил данные в течение некоторого времени (например, 1 час) в один файл и затем поместил его в HDFS. Другими словами, я подготовил файл большего размера на отдельном компьютере, а затем переместил их в hadoop – xhudik

ответ

2

Проверьте на Apache Kafka и Apache Flume. Вы можете объединять журналы и перемещаться в хранилище данных с ними.

Я бы использовал Flume лично. Легче использовать imho.

+0

Как насчет писца? –

+0

Не использовал его. Но я думаю, что это должно сделать трюк [как кажется здесь] (https://github.com/facebook/scribe) – serhanbaker

0

Если вы хотите использовать MapReduce существуют различные способы, которыми мы можем сделать что

  1. Hadoop архив или HAR файлы, являются архивирование файлов объект, который упаковывает файлы в HDFS блоков более эффективно, тем самым снижая NameNode использование памяти в то же время позволяя прозрачный доступ к файлам

  2. ситуация несколько облегчена CombineFileInputFormat, который был разработан хорошо работать с маленькими файлами. Где FileInputFormat создает разбиение на файл, CombineFileInputFormat упаковывает много файлов в каждый раздел, чтобы каждый обработчик имел больше для обработки. Решающим моментом, CombineFileInputFormat учитывает местоположение узла и стойки при определении того, какие блоки размещать в одном и том же расколе, поэтому он не ставит под угрозу скорость , при которой он может обрабатывать входные данные в типичном задании MapReduce.

  3. Один из способов избежать множества небольших файлов случай является слияние небольших файлов в большие файлы с помощью SequenceFile: ключи могут выступать в качестве имен файлов (или константа, такие как NullWritable, если они не нужны) и значения, как содержимое файла.

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