Размер разделения входных данных Hadoop и размер блока

Я прохожу через полное руководство по Hadoop, где оно четко объясняет разделение входных данных. Это идет как

Входные разделители не содержат фактических данных, скорее, они имеют места для хранения данных в HDFS

а также

Обычно размер входного разбиения совпадает с размером блока

1) допустим, что блок 64 МБ находится на узле A и реплицируется между 2 другими узлами (B,C), а размер входного разбиения для программы уменьшения карты составляет 64 МБ. Будет ли это разделение иметь только местоположение для узла A? Или он будет иметь места для всех трех узлов A, B, C?

2) Поскольку данные являются локальными для всех трех узлов, как фреймворк решает (выбирает) maptask для запуска на определенном узле?

3) Как это сделать, если размер входного разбиения больше или меньше размера блока?

7 ответов

Решение
  • Ответ @user1668782 - отличное объяснение вопроса, и я постараюсь дать его графическое представление.

  • Предположим, что у нас есть файл размером 400 МБ, состоящий из 4 записей(например, CSV-файл размером 400 МБ, имеющий 4 строки по 100 МБ каждая)

введите описание изображения здесь

  • Если размер блока HDFS настроен на 128 МБ, то 4 записи не будут равномерно распределены между блоками. Это будет выглядеть так

введите описание изображения здесь

  • Блок 1 содержит всю первую запись и 28-мегабайтный фрагмент второй записи.
  • Если преобразователь должен быть запущен в блоке 1, преобразователь не может обработать, так как у него не будет всей второй записи.
  • Это именно та проблема, которую решают входные разбиения. Разделение входных данных учитывает логические границы записей.

  • Предположим, что размер входного сплита составляет 200 МБ.

введите описание изображения здесь

  • Следовательно, входной раздел 1 должен иметь как запись 1, так и запись 2. И входной раздел 2 не будет начинаться с записи 2, поскольку запись 2 была назначена входному разделению 1. Входной раздел 2 начнется с записи 3.

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

Надеюсь это поможет.

Блок - это физическое представление данных. Разделение - это логическое представление данных, представленных в блоке.

Размер блока и разбиения можно изменить в свойствах.

Карта считывает данные из блока через разбиения, т.е. разделение действует как посредник между блоком и картографом.

Рассмотрим два блока:

Блок 1

аа bb cc dd ee ff gg hh ii jj

Блок 2

ооооооооооооооо пп кк лл нн

Теперь карта читает блок 1 до aa в JJ и не знает, как читать блок 2, т.е. блок не знает, как обрабатывать другой блок информации. Здесь происходит разделение, он формирует логическую группировку блоков 1 и 2 как единый блок, затем формирует смещение (ключ) и строку (значение), используя inputformat и считыватель записей, и отправляет карту для дальнейшей обработки.

Если ваш ресурс ограничен, и вы хотите ограничить количество карт, вы можете увеличить размер разделения. Например: если у нас есть 640 МБ из 10 блоков, то есть каждый блок по 64 МБ, а ресурс ограничен, то можно указать размер разделения как 128 МБ, тогда будет сформирована логическая группировка по 128 МБ, и будут выполнены только 5 карт с размером 128 МБ.

Если указать, что размер разделения равен false, тогда весь файл будет формировать одно входное разделение и обрабатываться одной картой, которая занимает больше времени для обработки, когда файл большой.

Разделение на входы - это логическое разделение ваших записей, тогда как блоки HDFS - это физическое разделение входных данных. Это чрезвычайно эффективно, когда они одинаковы, но на практике они никогда не бывают идеально выровненными. Записи могут пересекать границы блоков. Hadoop гарантирует обработку всех записей. Машина, обрабатывающая конкретное разбиение, может извлечь фрагмент записи из блока, отличного от его "основного" блока, который может находиться удаленно. Стоимость связи для извлечения фрагмента записи несущественна, потому что это происходит относительно редко.

Размер блока HDFS является точным числом, но размер входного разбиения основан на нашей логике данных, которая может немного отличаться от настроенного числа

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

Допустим, у вас есть текстовый файл, который охватывает 4 блока.

Файл:

ABCD
EFGH
IJKL
MNOP

Блоки:

block1: abcde
block2: fghij
block3: klmno
block4: p

расколы:

Split1: abcdefh
Split2: ijklmnop

Обратите внимание, что расщепления встроены в границы (записи) из файла. Теперь каждый сплит подается на картограф.

Если размер входного разбиения меньше размера блока, вы в конечном итоге будете использовать больше no.of mappers, наоборот.

Надеюсь, это поможет.

На 1) и 2): я не уверен на 100%, но если задача не может быть завершена - по какой-либо причине, в том числе, если что-то не так с разделением ввода - тогда оно завершается, и на его месте начинается еще одно: так что каждый maptask получает ровно один сплит с информацией о файле (вы можете быстро определить, так ли это, отладив локальный кластер, чтобы увидеть, какая информация хранится во входном сплит-объекте: я помню, что это только одно местоположение).

3): если формат файла разделяемый, то Hadoop попытается сократить файл до размера "inputSplit"; если нет, то это одна задача на файл, независимо от размера файла. Если вы измените значение минимального разделения ввода, то вы можете предотвратить слишком большое количество задач отображения, которые порождаются, если каждый из ваших входных файлов разделен на размер блока, но вы можете комбинировать входные данные только в том случае, если вы немного поработали с класс комбинатора (я думаю, это так и называется).

Сильной стороной фреймворка Hadoop является его локальность данных. Поэтому, когда клиент запрашивает данные hdfs, фреймворк всегда проверяет локальность, иначе он ищет небольшое использование ввода / вывода.

Другие вопросы по тегам