2010-08-04 4 views
0

Мне поручено обрабатывать данные SCM с несколькими терабайтами для моей компании. Я создал кластер hadoop и имею сценарий для вывода данных с наших серверов SCM.Проблемы с размером блока Hadoop

Поскольку я обрабатываю данные с помощью пакетов через интерфейс потоковой передачи, я столкнулся с проблемой с размерами блоков, которые, по-видимому, не затрагивает книга O'Reilly Hadoop: что происходит с данными, разделяющими два блока? Как пример wordcount обойти это? Чтобы обойти проблему до сих пор, мы прибегли к тому, чтобы наши входные файлы были меньше 64 МБ каждый.

Проблема возникла снова, когда мы думали о скрипте редуктора; как агрегированные данные хранятся на картах? И возникнет ли проблема при сокращении?

+0

Что такое SCM в вашем случае? – wlk

+0

Мы используем Perforce. – bhargav

ответ

1

Это не должно быть проблемой, при условии, что каждый блок может чисто разбить часть данных для разделов (например, по разрыву строки). Если ваши данные не являются строковыми данными, тогда да, это может быть проблемой. Вы также можете увеличить размер своих блоков в своем кластере (dfs.block.size).

Вы также можете настроить в вашем потоковом как входы собираются в ваш картографа

http://hadoop.apache.org/common/docs/current/streaming.html#Customizing+the+Way+to+Split+Lines+into+Key%2FValue+Pairs

данных на стадии карты получает сортируются вместе на основе класса partioner против ключа карты.

http://hadoop.apache.org/common/docs/r0.15.2/streaming.html#A+Useful+Partitioner+Class+%28secondary+sort%2C+the+-partitioner+org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner+option%29

Данные затем перемешиваются вместе, чтобы сделать все ключи карты вместе и затем переносили в редукторе. Иногда до перехода на редуктор приходит комбинатор, если вам нравится.

Скорее всего, вы можете создать свой собственный -inputreader (здесь приведен пример того, как поток XML документов http://hadoop.apache.org/common/docs/current/api/org/apache/hadoop/streaming/StreamXmlRecordReader.html)

+0

Это прекрасно.Большинство моих проблем были решены путем ограничения размера разделения файлов до 64 МБ (размер блока), таким образом сопоставляя каждый файл (который вписывается в один блок) в один процесс карты. На кластере из 2 узлов нам удалось обработать около 2 гб данных за 3 минуты - смешно быстро :) – bhargav

+0

Я не думаю, что должны быть проблемы с «разделенными» записями: как и в обычных файловых системах, размеры блоков - это физические конструкции которые не обязательно оказывают глубокое влияние на логический уровень. Поэтому, хотя полезно делать размер файла размером блока (в идеале меньше), чтобы избежать негативных проблем с производительностью, нет необходимости расколоть ради правильности. – StaxMan

0

Если у вас есть несколько терабайт ввода, вы должны рассмотреть возможность установки размера блока еще до 128 МБ.

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

Сплит берется автоматически, и вы не должны беспокоиться об этом. Вывод из карт хранится в каталоге tmp по hdfs.

0

Вашего вопроса о «данных трансзональных два блока» является то, что обрабатывает RecordReader. Цель RecordReader в 3 раза:

  1. Убедитесь, каждый K, V пара обрабатывается
  2. Убедитесь, каждый K, V пара обрабатывается только один раз
  3. Ручка K, V пары, которые разбиты на блоки

Что на самом деле происходит в (3), так это то, что RecordReader возвращается к NameNode, получает дескриптор DataNode, в котором живет следующий блок, а затем достигает через RPC, чтобы вытащить этот полный блок и прочитать оставшиеся часть этой первой записи до разделителя записей.

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