О разделении файлов Hadoop / HDFS - PullRequest
17 голосов
/ 13 февраля 2012

Хочу просто подтвердить следующее.Пожалуйста, проверьте, правильно ли это: 1. Насколько я понимаю, когда мы копируем файл в HDFS, именно в этот момент файл (при условии, что его размер> 64 МБ = размер блока HDFS) разбивается на несколько фрагментов, и каждый фрагмент сохраняется в разныхузлы данных.

  1. Содержимое файла уже разбивается на куски, когда файл копируется в HDFS, и это разделение файла не происходит во время выполнения задания карты.Задачи карты планируются только таким образом, чтобы они работали на каждом фрагменте макс.размер 64 МБ с локальностью данных (т. е. задача карты выполняется на том узле, который содержит данные / чанк)

  2. Разделение файла также происходит, если файл сжат (сжатым), но MR гарантирует, что каждыйфайл обрабатывается только одним преобразователем, т. е. MR соберет все фрагменты файла gzip, лежащие в других узлах данных, и передаст их одному преобразователю.

  3. Произойдет то же, что и вышеесли мы определим isSplitable () для возврата false, то есть все фрагменты файла будут обработаны одним преобразователем, работающим на одной машине.MR прочтет все фрагменты файла из разных узлов данных и сделает их доступными для одного преобразователя.

Ответы [ 3 ]

37 голосов
/ 17 апреля 2014

Ответ Дэвида в значительной степени ударяет по гвоздю с ног на голову, я просто углубляюсь в это здесь.

Здесь работают две разные концепции, каждая из которых обрабатывается отдельной сущностью в рамках hadoop

Во-первых -

1) Разделение файла на блоки - Когда файл записывается в HDFS, HDFS делит файл на блоки и заботится о его репликации.Это делается один раз (в основном), а затем становится доступным для всех заданий MR, работающих в кластере.Это кластерная конфигурация

Во-вторых -

2) Разделение файла на входные разбиения - Когда путь ввода передается в задание MR, задание MRиспользует путь вместе с форматом ввода, настроенным для разделения файлов, указанных в пути ввода, на разбиения, каждое разбиение обрабатывается задачей карты.Вычисление входных разбиений выполняется по формату ввода каждый раз, когда выполняется задание

Теперь, когда мы имеем это в своем распоряжении, мы можем понять, что метод isSplitable () относится ко второй категории.

Чтобы по-настоящему понять это, взгляните на поток данных записи HDFS (Концепция 1)

HDFS Write Data Flow

Второй момент на диаграмме, вероятно, где происходит разделение, обратите внимание, что этоне имеет ничего общего с запуском задания MR

Теперь рассмотрим этапы выполнения задания MR

MR

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

Большая часть вашей путаницы проистекает из того факта, что вы объединяете обе эти концепции, надеюсь, это немного прояснит ситуацию.

14 голосов
/ 13 февраля 2012

Ваше понимание не идеально. Я хотел бы отметить, что существует два, почти независимых процесса: разбиение файлов на блоки HDFS и разбиение файлов для обработки различными программами отображения.
HDFS разбивает файлы на блоки на основе определенного размера блока.
Каждый входной формат имеет свою собственную логику, как файлы могут быть разделены на части для независимой обработки различными преобразователями. Логика FileInputFormat по умолчанию - разделять файл по блокам HDFS. Вы можете реализовать любую другую логику
Сжатие, как правило, является врагом разделения, поэтому мы используем технику сжатия блоков, чтобы включить разделение сжатых данных. Это означает, что каждая логическая часть файла (блока) сжимается независимо.

1 голос
/ 16 апреля 2012

Да, содержимое файла разбивается на куски, когда файл копируется в HDFS. Размер блока настраивается, и если это, скажем, 128 МБ, то все 128 МБ будет одним блоком, а не 2 блоками по 64 МБ отдельно. Также не обязательно, чтобы каждый кусок файла хранился в отдельной датоде. В datanode может быть более одного фрагмента конкретного файла. И конкретный фрагмент может присутствовать в нескольких datanodes в зависимости от коэффициента репликации.

...