Очень большая пара ключ-значение в Hadoop

Я новичок в Hadoop, и моя текущая сложность программы ограничена сложностью количества слов. Я пытаюсь понять фундаментальную архитектуру Hadoop, чтобы лучше разрабатывать свои решения.

Один из важных вопросов, который у меня возникает, заключается в том, как Hadoop обрабатывает большие пары значений ключа на границах блоков? Предположим, у меня есть пара ключ-значение размером 10 МБ (например, если значение представляет собой целый файл размером 10 МБ), и предположим, что я использую файл последовательности. Как Hadoop справляется с этим на границах своих блоков? Разделяет ли он разделение на две части и сохраняет его в двух разных блоках, или он понимает, что пара ключ-значение очень велика, и, следовательно, вместо разделения он просто создает новый блок для всей пары ключ-значение?


person BegaluruBoy    schedule 19.12.2011    source источник
comment
Хороший вопрос! Я думаю, что он разбивает его посередине значения, а затем восстанавливает его во время выполнения (то есть игнорирует границы ключ/значение)... но я недостаточно уверен, чтобы дать официальный ответ.   -  person Donald Miner    schedule 19.12.2011


Ответы (1)


Размер блока по умолчанию в HDFS составляет 64 МБ. Если размер пары ключ/значение составляет 10 МБ, она может или не может быть разбита на блоки.

  • Если 1-я пара КВ 60 Мб, а 2-я 10 Мб. Затем у 2-й пары KV остается только 4 МБ свободного места в 1-м блоке (при размере блока 64 МБ). Итак, 4 МБ 2-го КВ хранится в 1-м блоке, а остальные 6 МБ хранятся во втором блоке.

  • Если 1-я пара КВ 40 Мб, а 2-я 10 Мб. Затем у 2-й пары KV остается 24 МБ свободного места в первом блоке (при размере блока 64 МБ). Итак, 2-й КВ хранится полностью в 1-м блоке и не разделяется.

При использовании SequenceFile сопоставитель не знает, где в блоке находится начало записи, поэтому среда Hadoop автоматически добавляет синхронизацию в SequenceFiles. Согласно Hadoop:Полное руководство

Точка синхронизации — это точка в потоке, которую можно использовать для повторной синхронизации с границей записи, если считыватель «потерялся» — например, после поиска произвольной позиции в потоке. Точки синхронизации записываются с помощью SequenceFile.Writer, который вставляет специальную запись для отметки точки синхронизации через каждые несколько записей по мере записи файла последовательности. Такие записи достаточно малы, чтобы нести лишь скромные накладные расходы на хранение — менее 1%. Точки синхронизации всегда совпадают с границами записи.

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

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

person Praveen Sripati    schedule 19.12.2011
comment
Спасибо за информацию. Это ответило на мой вопрос, но я предполагаю, что это также означает, что существуют довольно большие накладные расходы на передачу большого объема данных между узлами, когда большая пара значений ключа разделяется. (В вашем примере требуется либо 6 МБ, либо 4 МБ передачи). ТАК может быть, нет смысла иметь большие пары ключ-значение. Я прав? - person BegaluruBoy; 20.12.2011
comment
Если есть большая пара kv, то размер блока HDFS можно увеличить со значения по умолчанию 64 МБ. - person Praveen Sripati; 20.12.2011