О разделении файлов Hadoop/HDFS
Хочу просто подтвердить следующее. Пожалуйста, проверьте, правильно ли это: 1. Насколько я понимаю, когда мы копируем файл в HDFS, именно в этот момент файл (при условии, что его размер> 64 МБ = размер блока HDFS) разбивается на несколько фрагментов, и каждый фрагмент сохраняется в разных данные-узлы.
Содержимое файла уже разбивается на куски, когда файл копируется в HDFS, и это разделение файла не происходит во время выполнения задания карты. Задачи карты планируются только таким образом, чтобы они работали на каждом фрагменте макс. размер 64 МБ с локальностью данных (т.е. задача карты выполняется на том узле, который содержит данные / чанк)
Разделение файлов также происходит, если файл сжат (gzipped), но MR гарантирует, что каждый файл обрабатывается только одним сопоставителем, т.е. MR соберет все куски файла gzip, лежащие в других узлах данных, и передаст их одному сопоставителю.
То же самое, что и выше, произойдет, если мы определим isSplitable() для возврата false, то есть все фрагменты файла будут обработаны одним преобразователем, работающим на одной машине. MR прочтет все фрагменты файла из разных узлов данных и сделает их доступными для одного преобразователя.
3 ответа
Ваше понимание не идеально. Я хотел бы отметить, что существует два, почти независимых процесса: разбиение файлов на блоки HDFS и разбиение файлов для обработки различными программами отображения.
HDFS разбивает файлы на блоки на основе определенного размера блока.
Каждый входной формат имеет свою собственную логику, как файлы могут быть разделены на части для независимой обработки различными сопоставителями. Логика FileInputFormat по умолчанию - разделять файл по блокам HDFS. Вы можете реализовать любую другую логику
Сжатие, как правило, является врагом разделения, поэтому мы используем метод сжатия блоков, чтобы разрешить разделение сжатых данных. Это означает, что каждая логическая часть файла (блока) сжимается независимо.
Ответ Дэвида в значительной степени ударяет гвоздь по голове, я просто уточняю его здесь.
Здесь работают две разные концепции, каждая из которых обрабатывается отдельной сущностью в рамках hadoop
Во-первых --
1) Разделение файла на блоки. Когда файл записывается в HDFS, HDFS разделяет файл на блоки и заботится о его репликации. Это делается один раз (в основном), а затем становится доступным для всех заданий MR, работающих в кластере. Это кластерная конфигурация
Во вторых -
2) Разделение файла на входные разбиения - Когда входной путь передается в задание MR, задание MR использует путь вместе с форматом ввода, настроенным для разделения файлов, указанных в входном пути, на разбиения, каждое разделение обрабатывается задача карты. Расчет входных разбиений выполняется по формату ввода при каждом выполнении задания.
Теперь, когда у нас это есть, мы можем понять, что метод isSplitable() относится ко второй категории.
Чтобы по-настоящему понять это, взгляните на поток данных записи HDFS (Концепция 1).
Вторая точка на диаграмме, вероятно, где происходит разделение, обратите внимание, что это не имеет никакого отношения к выполнению задания MR.
Теперь посмотрим на этапы выполнения задания MR
Здесь первым шагом является вычисление входных разбиений через формат ввода, сконфигурированный для задания.
Большая часть вашего замешательства проистекает из того факта, что вы используете обе эти концепции, надеюсь, это немного прояснит ситуацию.
Да, содержимое файла разбивается на куски, когда файл копируется в HDFS. Размер блока настраивается, и если это, скажем, 128 МБ, то все 128 МБ будут одним блоком, а не 2 блоками по 64 МБ отдельно. Также не обязательно, чтобы каждый кусок файла хранился в отдельной датоде. Датоде может иметь более одного фрагмента конкретного файла. И конкретный фрагмент может присутствовать в более чем одном датоде в зависимости от коэффициента репликации.