Когда и где происходит расщепление? - PullRequest
0 голосов
/ 08 ноября 2018

Например, у меня есть файл 1 Гб в HDFS, как

2018-10-10 12:30  
EVENT INFORMATION  
2018-10-10 12:35  
ANOTHER EVENT INFORMATION  
...

Так что мне нужно использовать NLineInputFormat (N = 2), верно?
Вопрос о более концептуальных принципах. Когда и где этот файл размером 1 Гб преобразуется в InputSplits? Как hadoop работает с различной логикой расщепления? Нужно ли анализировать весь файл для создания разбиений (потому что нам нужно пройти файл, чтобы посчитать строки по одной)?
Этот файл разделен на 8 блоков в HDFS (1024/128). Итак, при отправке задания hadoop запускает маппер на каждом узле с блоками для этого файла (с размером разделения по умолчанию).

Что произойдет, если мой файл не будет аккуратно разделен? Как

<block1>
...
2018-10-10 12:
</block1>
<block2>
40
EVENT INFORMATION
...
</block2> 

Как первый картограф узнает об оставшейся части, которая находится на другой датоде?

Что произойдет, если размер разделения = 1/2 размера блока? Или размер блока 4/5? Как мастер приложения узнает, какой узел выбрать для запуска разделения?

Не могли бы вы уточнить это и дать мне несколько ссылок, чтобы получить его более глубоко?

1 Ответ

0 голосов
/ 09 ноября 2018

Деление данных (деление Файла на Блок), это физически верное деление
Разделение и блок HDFS - это отношения один ко многим;

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

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

когда вы читаете файл, он выглядит так

enter image description here

Клиент открывает файл, вызывая метод open () объекта FileSystem (соответствует файловой системе HDFS и вызывая объект DistributedFileSystem) (то есть первый шаг на рисунке). DistributedFileSystem вызывает NameNode через вызов RPC (удаленный вызов процедуры), чтобы получить это. Расположение файла первых нескольких блоков файла (шаг 2). Для каждого блока namenode возвращает информацию об адресе всех namenode, которые имеют эту резервную копию блока (отсортировано по расстоянию от клиента в сети топологии кластера. Как выполнить топологию сети в кластере Hadoop, см. Далее) .

Если клиент сам является датодой (если клиент является mapreduce задача) и сам датодет имеет требуемый блок файлов, клиент читает файл локально.

После того, как вышеупомянутые шаги выполнены, DistributedFileSystem возвратит FSDataInputStream (поддержка поиска файлов), клиент может читать данные из FSDataInputStream. FSDataInputStream оборачивает класс DFSInputSteam, который обрабатывает операции ввода-вывода для наменодов и датоданов.
Затем клиент выполняет метод read () (шаг 3), и DFSInputStream (который уже хранит информацию о местоположении первых нескольких блоков файла для чтения) подключается к первому датододу (то есть самому последнему датододу ) чтобы получить данные. При повторном вызове метода read () (четвертый и пятый этапы) данные в файле передаются клиенту. Когда читается конец блока, DFSInputStream закрывает поток, указывающий на блок, и вместо этого находит информацию о местоположении следующего блока, а затем повторно вызывает метод read () для продолжения потоковой передачи блока.
Эти процессы прозрачны для пользователя, и пользователю кажется, что это непрерывная потоковая передача всего файла.
Когда весь файл прочитан, клиент вызывает метод close () в FSDataInputSteam, чтобы закрыть поток ввода файла (шаг 6).

...