О разделении файлов Hadoop/HDFS

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

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

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

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

Ответ 1

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

Ответ 2

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

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

Во-первых -

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

Во-вторых -

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

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

Чтобы действительно прибить это, взгляните на поток данных записи HDFS (концепция 1)

HDFS Write Data Flow

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

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

MR

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

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

Ответ 3

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